@devalok/shilp-sutra 0.49.3 → 0.49.5

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 (329) hide show
  1. package/dist/_chunks/badge-group.js +8 -7
  2. package/dist/_chunks/badge-group.js.map +1 -1
  3. package/dist/_chunks/block-shell.js.map +1 -1
  4. package/dist/_chunks/chart-container.js.map +1 -1
  5. package/dist/_chunks/chat.js.map +1 -1
  6. package/dist/_chunks/colors.js.map +1 -1
  7. package/dist/_chunks/document-preview.js.map +1 -1
  8. package/dist/_chunks/emoji-suggestion.js.map +1 -1
  9. package/dist/_chunks/emoji.js +2 -2
  10. package/dist/_chunks/emoji.js.map +1 -1
  11. package/dist/_chunks/field-state.js.map +1 -1
  12. package/dist/_chunks/grid-lines.js.map +1 -1
  13. package/dist/_chunks/image-preview.js.map +1 -1
  14. package/dist/_chunks/keybinding.js.map +1 -1
  15. package/dist/_chunks/link-context.js.map +1 -1
  16. package/dist/_chunks/mention-suggestion.js.map +1 -1
  17. package/dist/_chunks/motion-provider.js.map +1 -1
  18. package/dist/_chunks/normalize-icon.js.map +1 -1
  19. package/dist/_chunks/oauth-button.js.map +1 -1
  20. package/dist/_chunks/popover.js.map +1 -1
  21. package/dist/_chunks/primitives.js +1123 -1153
  22. package/dist/_chunks/primitives.js.map +1 -1
  23. package/dist/_chunks/shared.js.map +1 -1
  24. package/dist/_chunks/success.js.map +1 -1
  25. package/dist/_chunks/tiptap.js +4283 -3460
  26. package/dist/_chunks/tiptap.js.map +1 -1
  27. package/dist/_chunks/tooltip.js.map +1 -1
  28. package/dist/_chunks/tree-view.js +1 -1
  29. package/dist/_chunks/tree-view.js.map +1 -1
  30. package/dist/_chunks/use-calendar.js.map +1 -1
  31. package/dist/_chunks/use-controllable-open.js.map +1 -1
  32. package/dist/_chunks/vendor-client.js +86 -59
  33. package/dist/_chunks/vendor-client.js.map +1 -1
  34. package/dist/_chunks/vendor-utils.js +555 -513
  35. package/dist/_chunks/vendor-utils.js.map +1 -1
  36. package/dist/ai/ai-command-provider.d.ts +1 -1
  37. package/dist/ai/ai-command-provider.d.ts.map +1 -1
  38. package/dist/ai/ai-command-provider.js.map +1 -1
  39. package/dist/ai/block-renderer.js.map +1 -1
  40. package/dist/ai/blocks/block-shell.d.ts +1 -1
  41. package/dist/ai/blocks/block-shell.d.ts.map +1 -1
  42. package/dist/ai/blocks/block-table.d.ts +1 -1
  43. package/dist/ai/blocks/block-table.d.ts.map +1 -1
  44. package/dist/ai/blocks/confirm.d.ts +1 -1
  45. package/dist/ai/blocks/confirm.d.ts.map +1 -1
  46. package/dist/ai/blocks/divider.d.ts +1 -1
  47. package/dist/ai/blocks/divider.d.ts.map +1 -1
  48. package/dist/ai/blocks/error.d.ts +1 -1
  49. package/dist/ai/blocks/error.d.ts.map +1 -1
  50. package/dist/ai/blocks/error.js.map +1 -1
  51. package/dist/ai/blocks/info.d.ts +1 -1
  52. package/dist/ai/blocks/info.d.ts.map +1 -1
  53. package/dist/ai/blocks/loading.d.ts +1 -1
  54. package/dist/ai/blocks/loading.d.ts.map +1 -1
  55. package/dist/ai/blocks/stat-row.d.ts +1 -1
  56. package/dist/ai/blocks/stat-row.d.ts.map +1 -1
  57. package/dist/ai/blocks/success.d.ts +1 -1
  58. package/dist/ai/blocks/success.d.ts.map +1 -1
  59. package/dist/ai/blocks/text.d.ts +1 -1
  60. package/dist/ai/blocks/text.d.ts.map +1 -1
  61. package/dist/ai/blocks/text.js.map +1 -1
  62. package/dist/ai/command-bar.js.map +1 -1
  63. package/dist/ai/conversation.js.map +1 -1
  64. package/dist/ai/devadoot-icon.d.ts +1 -1
  65. package/dist/ai/devadoot-icon.d.ts.map +1 -1
  66. package/dist/ai/index.js.map +1 -1
  67. package/dist/composed/activity-feed.js.map +1 -1
  68. package/dist/composed/avatar-group.js.map +1 -1
  69. package/dist/composed/bulk-action-bar.js.map +1 -1
  70. package/dist/composed/command-palette.js.map +1 -1
  71. package/dist/composed/confirm-dialog.js.map +1 -1
  72. package/dist/composed/content-card.js.map +1 -1
  73. package/dist/composed/date-picker/index.js.map +1 -1
  74. package/dist/composed/deadline-indicator.js.map +1 -1
  75. package/dist/composed/emoji-picker.d.ts +2 -2
  76. package/dist/composed/emoji-picker.d.ts.map +1 -1
  77. package/dist/composed/emoji-picker.js.map +1 -1
  78. package/dist/composed/empty-state.js.map +1 -1
  79. package/dist/composed/error-boundary.d.ts +1 -1
  80. package/dist/composed/error-boundary.js.map +1 -1
  81. package/dist/composed/extensions/emoji-node.js.map +1 -1
  82. package/dist/composed/file-preview/audio-preview.d.ts +2 -1
  83. package/dist/composed/file-preview/audio-preview.d.ts.map +1 -1
  84. package/dist/composed/file-preview/document-preview.d.ts +2 -1
  85. package/dist/composed/file-preview/document-preview.d.ts.map +1 -1
  86. package/dist/composed/file-preview/embed-preview.d.ts +2 -1
  87. package/dist/composed/file-preview/embed-preview.d.ts.map +1 -1
  88. package/dist/composed/file-preview/image-preview.d.ts +2 -1
  89. package/dist/composed/file-preview/image-preview.d.ts.map +1 -1
  90. package/dist/composed/file-preview/shared.d.ts +5 -5
  91. package/dist/composed/file-preview/shared.d.ts.map +1 -1
  92. package/dist/composed/file-preview/video-preview.d.ts +2 -1
  93. package/dist/composed/file-preview/video-preview.d.ts.map +1 -1
  94. package/dist/composed/file-preview.d.ts +1 -1
  95. package/dist/composed/file-preview.d.ts.map +1 -1
  96. package/dist/composed/file-preview.js.map +1 -1
  97. package/dist/composed/filter-bar.d.ts +2 -2
  98. package/dist/composed/filter-bar.d.ts.map +1 -1
  99. package/dist/composed/filter-bar.js.map +1 -1
  100. package/dist/composed/form-section.js.map +1 -1
  101. package/dist/composed/global-loading.js.map +1 -1
  102. package/dist/composed/inline-edit.js.map +1 -1
  103. package/dist/composed/lib/string-utils.js.map +1 -1
  104. package/dist/composed/loading-skeleton.js.map +1 -1
  105. package/dist/composed/markdown-viewer.js.map +1 -1
  106. package/dist/composed/master-detail.d.ts +3 -3
  107. package/dist/composed/master-detail.d.ts.map +1 -1
  108. package/dist/composed/master-detail.js.map +1 -1
  109. package/dist/composed/member-picker.js.map +1 -1
  110. package/dist/composed/multi-select-popover.js.map +1 -1
  111. package/dist/composed/page-header.js.map +1 -1
  112. package/dist/composed/page-skeletons.js.map +1 -1
  113. package/dist/composed/priority-indicator.js.map +1 -1
  114. package/dist/composed/responsive-modal.js +8 -4
  115. package/dist/composed/responsive-modal.js.map +1 -1
  116. package/dist/composed/rich-chat-input/attachment-strip.d.ts +2 -1
  117. package/dist/composed/rich-chat-input/attachment-strip.d.ts.map +1 -1
  118. package/dist/composed/rich-chat-input/chat-toolbar.d.ts +17 -17
  119. package/dist/composed/rich-chat-input/chat-toolbar.d.ts.map +1 -1
  120. package/dist/composed/rich-chat-input/recording-overlay.d.ts +2 -1
  121. package/dist/composed/rich-chat-input/recording-overlay.d.ts.map +1 -1
  122. package/dist/composed/rich-chat-input/reply-banner.d.ts +2 -1
  123. package/dist/composed/rich-chat-input/reply-banner.d.ts.map +1 -1
  124. package/dist/composed/rich-chat-input/schedule-send.d.ts +4 -3
  125. package/dist/composed/rich-chat-input/schedule-send.d.ts.map +1 -1
  126. package/dist/composed/rich-chat-input.js +2 -1
  127. package/dist/composed/rich-chat-input.js.map +1 -1
  128. package/dist/composed/rich-text-editor.js +2 -1
  129. package/dist/composed/rich-text-editor.js.map +1 -1
  130. package/dist/composed/schedule-view.js.map +1 -1
  131. package/dist/composed/simple-tooltip.js.map +1 -1
  132. package/dist/composed/status-badge.js.map +1 -1
  133. package/dist/hooks/use-color-mode.js +2 -1
  134. package/dist/hooks/use-color-mode.js.map +1 -1
  135. package/dist/hooks/use-mobile.js.map +1 -1
  136. package/dist/hooks/use-touch-device.js.map +1 -1
  137. package/dist/hooks/use-viewport-height.js.map +1 -1
  138. package/dist/motion/index.js.map +1 -1
  139. package/dist/motion/motion-provider.d.ts +1 -1
  140. package/dist/motion/motion-provider.d.ts.map +1 -1
  141. package/dist/motion/primitives-index.js.map +1 -1
  142. package/dist/shell/app-command-palette.js.map +1 -1
  143. package/dist/shell/bottom-navbar.js.map +1 -1
  144. package/dist/shell/command-registry.d.ts +1 -1
  145. package/dist/shell/command-registry.d.ts.map +1 -1
  146. package/dist/shell/command-registry.js.map +1 -1
  147. package/dist/shell/notification-center.js.map +1 -1
  148. package/dist/shell/notification-preferences.js.map +1 -1
  149. package/dist/shell/sidebar.js.map +1 -1
  150. package/dist/shell/top-bar.js.map +1 -1
  151. package/dist/ui/accordion.js.map +1 -1
  152. package/dist/ui/alert-dialog.js.map +1 -1
  153. package/dist/ui/alert.js.map +1 -1
  154. package/dist/ui/aspect-ratio.js.map +1 -1
  155. package/dist/ui/autocomplete.d.ts.map +1 -1
  156. package/dist/ui/autocomplete.js +8 -0
  157. package/dist/ui/autocomplete.js.map +1 -1
  158. package/dist/ui/avatar.d.ts +1 -1
  159. package/dist/ui/avatar.js.map +1 -1
  160. package/dist/ui/badge-group.d.ts +2 -6
  161. package/dist/ui/badge-group.d.ts.map +1 -1
  162. package/dist/ui/badge-indicator.d.ts +2 -6
  163. package/dist/ui/badge-indicator.d.ts.map +1 -1
  164. package/dist/ui/badge-indicator.js +19 -18
  165. package/dist/ui/badge-indicator.js.map +1 -1
  166. package/dist/ui/badge.d.ts +2 -4
  167. package/dist/ui/badge.d.ts.map +1 -1
  168. package/dist/ui/banner.js.map +1 -1
  169. package/dist/ui/breadcrumb.d.ts +2 -2
  170. package/dist/ui/breadcrumb.js.map +1 -1
  171. package/dist/ui/button-group.js.map +1 -1
  172. package/dist/ui/button-processing.d.ts +2 -1
  173. package/dist/ui/button-processing.d.ts.map +1 -1
  174. package/dist/ui/button-processing.js.map +1 -1
  175. package/dist/ui/button.js.map +1 -1
  176. package/dist/ui/card.js +1 -1
  177. package/dist/ui/card.js.map +1 -1
  178. package/dist/ui/charts/_internal/axes.d.ts +2 -1
  179. package/dist/ui/charts/_internal/axes.d.ts.map +1 -1
  180. package/dist/ui/charts/_internal/grid-lines.d.ts +2 -1
  181. package/dist/ui/charts/_internal/grid-lines.d.ts.map +1 -1
  182. package/dist/ui/charts/_internal/legend.d.ts +2 -1
  183. package/dist/ui/charts/_internal/legend.d.ts.map +1 -1
  184. package/dist/ui/charts/_internal/tooltip.d.ts +1 -1
  185. package/dist/ui/charts/_internal/tooltip.d.ts.map +1 -1
  186. package/dist/ui/charts/area-chart.js.map +1 -1
  187. package/dist/ui/charts/bar-chart.js.map +1 -1
  188. package/dist/ui/charts/gauge-chart.js.map +1 -1
  189. package/dist/ui/charts/line-chart.js.map +1 -1
  190. package/dist/ui/charts/pie-chart.js.map +1 -1
  191. package/dist/ui/charts/radar-chart.js.map +1 -1
  192. package/dist/ui/charts/sparkline.js +2 -2
  193. package/dist/ui/charts/sparkline.js.map +1 -1
  194. package/dist/ui/chat/date-separator.d.ts +2 -1
  195. package/dist/ui/chat/date-separator.d.ts.map +1 -1
  196. package/dist/ui/chat/message.d.ts +8 -8
  197. package/dist/ui/chat/message.d.ts.map +1 -1
  198. package/dist/ui/chat/typing-indicator.d.ts +2 -1
  199. package/dist/ui/chat/typing-indicator.d.ts.map +1 -1
  200. package/dist/ui/chat/unread-separator.d.ts +2 -1
  201. package/dist/ui/chat/unread-separator.d.ts.map +1 -1
  202. package/dist/ui/checkbox.js.map +1 -1
  203. package/dist/ui/code.js.map +1 -1
  204. package/dist/ui/collapsible.js.map +1 -1
  205. package/dist/ui/color-input.d.ts.map +1 -1
  206. package/dist/ui/color-input.js +156 -149
  207. package/dist/ui/color-input.js.map +1 -1
  208. package/dist/ui/color-swatch.js.map +1 -1
  209. package/dist/ui/combobox.d.ts.map +1 -1
  210. package/dist/ui/combobox.js +137 -127
  211. package/dist/ui/combobox.js.map +1 -1
  212. package/dist/ui/container.js.map +1 -1
  213. package/dist/ui/context-menu.d.ts +2 -2
  214. package/dist/ui/context-menu.js.map +1 -1
  215. package/dist/ui/data-table-body.d.ts +1 -1
  216. package/dist/ui/data-table-body.d.ts.map +1 -1
  217. package/dist/ui/data-table-body.js +1 -1
  218. package/dist/ui/data-table-body.js.map +1 -1
  219. package/dist/ui/data-table-bulk-actions.d.ts +2 -1
  220. package/dist/ui/data-table-bulk-actions.d.ts.map +1 -1
  221. package/dist/ui/data-table-bulk-actions.js.map +1 -1
  222. package/dist/ui/data-table-card.d.ts +1 -1
  223. package/dist/ui/data-table-card.d.ts.map +1 -1
  224. package/dist/ui/data-table-card.js.map +1 -1
  225. package/dist/ui/data-table-context.d.ts +1 -1
  226. package/dist/ui/data-table-context.d.ts.map +1 -1
  227. package/dist/ui/data-table-context.js.map +1 -1
  228. package/dist/ui/data-table-header.d.ts +2 -1
  229. package/dist/ui/data-table-header.d.ts.map +1 -1
  230. package/dist/ui/data-table-header.js.map +1 -1
  231. package/dist/ui/data-table-pagination.d.ts +2 -1
  232. package/dist/ui/data-table-pagination.d.ts.map +1 -1
  233. package/dist/ui/data-table-pagination.js.map +1 -1
  234. package/dist/ui/data-table-toolbar.d.ts +1 -1
  235. package/dist/ui/data-table-toolbar.d.ts.map +1 -1
  236. package/dist/ui/data-table-toolbar.js.map +1 -1
  237. package/dist/ui/data-table.d.ts +1 -1
  238. package/dist/ui/data-table.d.ts.map +1 -1
  239. package/dist/ui/data-table.js.map +1 -1
  240. package/dist/ui/devalok-grain.d.ts +2 -1
  241. package/dist/ui/devalok-grain.d.ts.map +1 -1
  242. package/dist/ui/devalok-grain.js.map +1 -1
  243. package/dist/ui/dialog.js.map +1 -1
  244. package/dist/ui/dot.js +1 -1
  245. package/dist/ui/dot.js.map +1 -1
  246. package/dist/ui/dropdown-menu.d.ts +1 -1
  247. package/dist/ui/dropdown-menu.js.map +1 -1
  248. package/dist/ui/file-upload.js.map +1 -1
  249. package/dist/ui/form.js.map +1 -1
  250. package/dist/ui/hover-card.js.map +1 -1
  251. package/dist/ui/icon-button.js.map +1 -1
  252. package/dist/ui/icon-context.d.ts +1 -1
  253. package/dist/ui/icon-context.d.ts.map +1 -1
  254. package/dist/ui/icon-context.js.map +1 -1
  255. package/dist/ui/icon-group.js.map +1 -1
  256. package/dist/ui/icon.js.map +1 -1
  257. package/dist/ui/index.js.map +1 -1
  258. package/dist/ui/input-otp.js.map +1 -1
  259. package/dist/ui/input.js.map +1 -1
  260. package/dist/ui/label.js.map +1 -1
  261. package/dist/ui/lib/bottom-sheet.d.ts +1 -1
  262. package/dist/ui/lib/bottom-sheet.d.ts.map +1 -1
  263. package/dist/ui/lib/date-utils.js.map +1 -1
  264. package/dist/ui/lib/link-context.d.ts +1 -1
  265. package/dist/ui/lib/link-context.d.ts.map +1 -1
  266. package/dist/ui/lib/motion.js.map +1 -1
  267. package/dist/ui/lib/utils.js.map +1 -1
  268. package/dist/ui/link.js.map +1 -1
  269. package/dist/ui/menubar.d.ts +1 -1
  270. package/dist/ui/menubar.js.map +1 -1
  271. package/dist/ui/navigation-menu.js +14 -9
  272. package/dist/ui/navigation-menu.js.map +1 -1
  273. package/dist/ui/number-input.d.ts.map +1 -1
  274. package/dist/ui/number-input.js +2 -1
  275. package/dist/ui/number-input.js.map +1 -1
  276. package/dist/ui/pagination.js.map +1 -1
  277. package/dist/ui/progress-ring.js.map +1 -1
  278. package/dist/ui/progress.js.map +1 -1
  279. package/dist/ui/radio.js.map +1 -1
  280. package/dist/ui/search-input.js.map +1 -1
  281. package/dist/ui/segmented-control.js.map +1 -1
  282. package/dist/ui/select.d.ts.map +1 -1
  283. package/dist/ui/select.js +1 -0
  284. package/dist/ui/select.js.map +1 -1
  285. package/dist/ui/separator.js.map +1 -1
  286. package/dist/ui/sheet.js.map +1 -1
  287. package/dist/ui/sidebar.js +1 -1
  288. package/dist/ui/sidebar.js.map +1 -1
  289. package/dist/ui/skeleton.js.map +1 -1
  290. package/dist/ui/slider.js.map +1 -1
  291. package/dist/ui/spinner.js.map +1 -1
  292. package/dist/ui/split-button.js.map +1 -1
  293. package/dist/ui/stack.js.map +1 -1
  294. package/dist/ui/stat-card.js.map +1 -1
  295. package/dist/ui/stat-flash.d.ts +2 -1
  296. package/dist/ui/stat-flash.d.ts.map +1 -1
  297. package/dist/ui/stat-flash.js +1 -1
  298. package/dist/ui/stat-flash.js.map +1 -1
  299. package/dist/ui/stepper.d.ts +1 -1
  300. package/dist/ui/stepper.d.ts.map +1 -1
  301. package/dist/ui/stepper.js +1 -1
  302. package/dist/ui/stepper.js.map +1 -1
  303. package/dist/ui/surface.js.map +1 -1
  304. package/dist/ui/switch.d.ts +1 -1
  305. package/dist/ui/switch.js.map +1 -1
  306. package/dist/ui/table-row-link.js.map +1 -1
  307. package/dist/ui/table.js.map +1 -1
  308. package/dist/ui/tabs.js.map +1 -1
  309. package/dist/ui/text.js.map +1 -1
  310. package/dist/ui/textarea.d.ts.map +1 -1
  311. package/dist/ui/textarea.js +3 -2
  312. package/dist/ui/textarea.js.map +1 -1
  313. package/dist/ui/toast-registry.js.map +1 -1
  314. package/dist/ui/toast.d.ts +4 -4
  315. package/dist/ui/toast.d.ts.map +1 -1
  316. package/dist/ui/toast.js +5 -3
  317. package/dist/ui/toast.js.map +1 -1
  318. package/dist/ui/toaster.js.map +1 -1
  319. package/dist/ui/toggle-group.js.map +1 -1
  320. package/dist/ui/toggle.js.map +1 -1
  321. package/dist/ui/tooltip.js.map +1 -1
  322. package/dist/ui/truncated-text.js.map +1 -1
  323. package/dist/ui/visually-hidden.js.map +1 -1
  324. package/docs/components/ui/data-table.md +2 -2
  325. package/llms.txt +1 -1
  326. package/mcp-manifest.json +3 -3
  327. package/package.json +21 -21
  328. package/skill/SKILL.md +1 -1
  329. package/skill/references/components.md +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"toggle.js","names":[],"sources":["../../src/ui/toggle.tsx"],"sourcesContent":["'use client'\n\nimport * as TogglePrimitive from '@primitives/react-toggle'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { motionProps,springs } from './lib/motion'\nimport { cn } from './lib/utils'\n\nconst MotionToggleRoot = motion.create(TogglePrimitive.Root)\n\nconst toggleVariants = cva(\n 'inline-flex items-center justify-center gap-ds-03 rounded-control font-medium transition-colors duration-fast-01 ease-productive-standard focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-action-disabled',\n {\n variants: {\n variant: {\n default:\n 'bg-transparent hover:bg-surface-raised-hover text-surface-fg-muted',\n outline:\n 'border border-surface-border-strong bg-transparent hover:bg-surface-raised-hover hover:border-surface-border-strong',\n },\n size: {\n sm: 'h-ds-sm px-ds-03 text-ds-sm',\n md: 'h-ds-md px-ds-04 text-ds-md',\n lg: 'h-ds-lg px-ds-05 text-ds-base',\n },\n color: {\n accent: 'data-[state=on]:bg-accent-2 data-[state=on]:text-accent-11',\n error: 'data-[state=on]:bg-error-2 data-[state=on]:text-error-11',\n success: 'data-[state=on]:bg-success-2 data-[state=on]:text-success-11',\n neutral: 'data-[state=on]:bg-surface-raised-hover data-[state=on]:text-surface-fg',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n color: 'accent',\n },\n },\n)\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, color, ...props }, ref) => (\n <MotionToggleRoot\n ref={ref}\n whileTap={{ scale: 0.95 }}\n transition={springs.snappy}\n className={cn(toggleVariants({ variant, size, color }), className)}\n {...motionProps(props)}\n />\n))\nToggle.displayName = TogglePrimitive.Root.displayName\n\nexport type ToggleProps = React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>\n\nexport { Toggle, toggleVariants }\n"],"mappings":";;;;;;;;;AAUA,IAAM,IAAmB,EAAO,OAAO,EAAqB,EAEtD,IAAiB,EACrB,qTACA;CACE,UAAU;EACR,SAAS;GACP,SACE;GACF,SACE;GACH;EACD,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACL;EACD,OAAO;GACL,QAAQ;GACR,OAAO;GACP,SAAS;GACT,SAAS;GACV;EACF;CACD,iBAAiB;EACf,SAAS;EACT,MAAM;EACN,OAAO;EACR;CACF,CACF,EAEK,IAAS,EAAM,YAIlB,EAAE,cAAW,YAAS,SAAM,UAAO,GAAG,KAAS,MAChD,kBAAC,GAAD;CACO;CACL,UAAU,EAAE,OAAO,KAAM;CACzB,YAAY,EAAQ;CACpB,WAAW,EAAG,EAAe;EAAE;EAAS;EAAM;EAAO,CAAC,EAAE,EAAU;CAClE,GAAI,EAAY,EAAM;CACtB,CAAA,CACF;AACF,EAAO,cAAA,EAAmC"}
1
+ {"version":3,"file":"toggle.js","names":[],"sources":["../../src/ui/toggle.tsx"],"sourcesContent":["'use client'\n\nimport * as TogglePrimitive from '@primitives/react-toggle'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { motionProps,springs } from './lib/motion'\nimport { cn } from './lib/utils'\n\nconst MotionToggleRoot = motion.create(TogglePrimitive.Root)\n\nconst toggleVariants = cva(\n 'inline-flex items-center justify-center gap-ds-03 rounded-control font-medium transition-colors duration-fast-01 ease-productive-standard focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-action-disabled',\n {\n variants: {\n variant: {\n default:\n 'bg-transparent hover:bg-surface-raised-hover text-surface-fg-muted',\n outline:\n 'border border-surface-border-strong bg-transparent hover:bg-surface-raised-hover hover:border-surface-border-strong',\n },\n size: {\n sm: 'h-ds-sm px-ds-03 text-ds-sm',\n md: 'h-ds-md px-ds-04 text-ds-md',\n lg: 'h-ds-lg px-ds-05 text-ds-base',\n },\n color: {\n accent: 'data-[state=on]:bg-accent-2 data-[state=on]:text-accent-11',\n error: 'data-[state=on]:bg-error-2 data-[state=on]:text-error-11',\n success: 'data-[state=on]:bg-success-2 data-[state=on]:text-success-11',\n neutral: 'data-[state=on]:bg-surface-raised-hover data-[state=on]:text-surface-fg',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n color: 'accent',\n },\n },\n)\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, color, ...props }, ref) => (\n <MotionToggleRoot\n ref={ref}\n whileTap={{ scale: 0.95 }}\n transition={springs.snappy}\n className={cn(toggleVariants({ variant, size, color }), className)}\n {...motionProps(props)}\n />\n))\nToggle.displayName = TogglePrimitive.Root.displayName\n\nexport type ToggleProps = React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>\n\nexport { Toggle, toggleVariants }\n"],"mappings":";;;;;;;;;AAUA,IAAM,IAAmB,EAAO,OAAO,CAAoB,GAErD,IAAiB,EACrB,qTACA;CACE,UAAU;EACR,SAAS;GACP,SACE;GACF,SACE;EACJ;EACA,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;EACN;EACA,OAAO;GACL,QAAQ;GACR,OAAO;GACP,SAAS;GACT,SAAS;EACX;CACF;CACA,iBAAiB;EACf,SAAS;EACT,MAAM;EACN,OAAO;CACT;AACF,CACF,GAEM,IAAS,EAAM,YAIlB,EAAE,cAAW,YAAS,SAAM,UAAO,GAAG,KAAS,MAChD,kBAAC,GAAD;CACO;CACL,UAAU,EAAE,OAAO,IAAK;CACxB,YAAY,EAAQ;CACpB,WAAW,EAAG,EAAe;EAAE;EAAS;EAAM;CAAM,CAAC,GAAG,CAAS;CACjE,GAAI,EAAY,CAAK;AACtB,CAAA,CACF;AACD,EAAO,cAAA,EAAmC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.js","names":[],"sources":["../../src/ui/tooltip.tsx"],"sourcesContent":["'use client'\n\nimport * as TooltipPrimitive from '@primitives/react-tooltip'\nimport { AnimatePresence,motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { springs, tweens } from './lib/motion'\nimport { useControllableOpen } from './lib/use-controllable-open'\nimport { cn } from './lib/utils'\n\n// ── Auto-provider: wraps with TooltipPrimitive.Provider if none exists ──\n\nconst TooltipProviderContext = React.createContext(false)\n\nconst TooltipProvider: React.FC<React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Provider>> = ({\n children,\n ...props\n}) => (\n <TooltipProviderContext.Provider value={true}>\n <TooltipPrimitive.Provider {...props}>\n {children}\n </TooltipPrimitive.Provider>\n </TooltipProviderContext.Provider>\n)\n\nfunction AutoProvider({ children }: { children: React.ReactNode }) {\n const hasProvider = React.useContext(TooltipProviderContext)\n if (hasProvider) return <>{children}</>\n return (\n <TooltipProviderContext.Provider value={true}>\n <TooltipPrimitive.Provider delayDuration={300}>\n {children}\n </TooltipPrimitive.Provider>\n </TooltipProviderContext.Provider>\n )\n}\n\n// ── Internal context to thread `open` state to animated children ──\n\ntype TooltipContextValue = { open: boolean }\nconst TooltipContext = React.createContext<TooltipContextValue>({ open: false })\n\nconst Tooltip: React.FC<React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>> = ({\n open: openProp,\n defaultOpen,\n onOpenChange,\n ...props\n}) => {\n const { open, setOpen } = useControllableOpen({ open: openProp, defaultOpen, onOpenChange })\n\n const contextValue = React.useMemo(() => ({ open }), [open])\n\n return (\n <AutoProvider>\n <TooltipContext.Provider value={contextValue}>\n <TooltipPrimitive.Root open={open} onOpenChange={setOpen} {...props} />\n </TooltipContext.Provider>\n </AutoProvider>\n )\n}\nTooltip.displayName = 'Tooltip'\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\n// ── Side-based slide offsets ──\n\nconst sideOffset: Record<string, { x?: number; y?: number }> = {\n top: { y: 4 },\n bottom: { y: -4 },\n left: { x: 4 },\n right: { x: -4 },\n}\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset: sideOffsetProp = 4, side = 'top', children, ...props }, ref) => {\n const { open } = React.useContext(TooltipContext)\n const slideInit = sideOffset[side] ?? {}\n\n return (\n <AnimatePresence>\n {open && (\n <TooltipPrimitive.Portal forceMount>\n <TooltipPrimitive.Content\n ref={ref}\n forceMount\n sideOffset={sideOffsetProp}\n side={side}\n {...props}\n asChild\n >\n <motion.div\n initial={{ opacity: 0, scale: 0.95, ...slideInit }}\n animate={{ opacity: 1, scale: 1, x: 0, y: 0 }}\n exit={{ opacity: 0, scale: 0.95, ...slideInit }}\n transition={{ ...springs.snappy, opacity: tweens.fade }}\n className={cn(\n 'z-tooltip overflow-hidden rounded-overlay-sm bg-surface-inverted px-ds-04 py-ds-02b text-ds-sm text-surface-inverted-fg shadow-floating',\n className,\n )}\n >\n {children}\n </motion.div>\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )}\n </AnimatePresence>\n )\n})\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport type TooltipContentProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n\nexport { Tooltip, TooltipContent, TooltipProvider,TooltipTrigger }\n"],"mappings":";;;;;;;;;AAYA,IAAM,IAAyB,EAAM,cAAc,GAAM,EAEnD,KAA+F,EACnG,aACA,GAAG,QAEH,kBAAC,EAAuB,UAAxB;CAAiC,OAAO;WACtC,kBAAC,GAAD;EAA2B,GAAI;EAC5B;EACyB,CAAA;CACI,CAAA;AAGpC,SAAS,EAAa,EAAE,eAA2C;AAGjE,QAFoB,EAAM,WAAW,EAAuB,GACpC,kBAAA,GAAA,EAAG,aAAY,CAAA,GAErC,kBAAC,EAAuB,UAAxB;EAAiC,OAAO;YACtC,kBAAC,GAAD;GAA2B,eAAe;GACvC;GACyB,CAAA;EACI,CAAA;;AAOtC,IAAM,IAAiB,EAAM,cAAmC,EAAE,MAAM,IAAO,CAAC,EAE1E,KAAmF,EACvF,MAAM,GACN,gBACA,iBACA,GAAG,QACC;CACJ,IAAM,EAAE,SAAM,eAAY,EAAoB;EAAE,MAAM;EAAU;EAAa;EAAc,CAAC,EAEtF,IAAe,EAAM,eAAe,EAAE,SAAM,GAAG,CAAC,EAAK,CAAC;AAE5D,QACE,kBAAC,GAAD,EAAA,UACE,kBAAC,EAAe,UAAhB;EAAyB,OAAO;YAC9B,kBAAC,GAAD;GAA6B;GAAM,cAAc;GAAS,GAAI;GAAS,CAAA;EAC/C,CAAA,EACb,CAAA;;AAGnB,EAAQ,cAAc;AAEtB,IAAM,IAAiB,GAIjB,IAAyD;CAC7D,KAAK,EAAE,GAAG,GAAG;CACb,QAAQ,EAAE,GAAG,IAAI;CACjB,MAAM,EAAE,GAAG,GAAG;CACd,OAAO,EAAE,GAAG,IAAI;CACjB,EAEK,IAAiB,EAAM,YAG1B,EAAE,cAAW,YAAY,IAAiB,GAAG,UAAO,OAAO,aAAU,GAAG,KAAS,MAAQ;CAC1F,IAAM,EAAE,YAAS,EAAM,WAAW,EAAe,EAC3C,IAAY,EAAW,MAAS,EAAE;AAExC,QACE,kBAAC,GAAD,EAAA,UACG,KACC,kBAAC,GAAD;EAAyB,YAAA;YACvB,kBAAC,GAAD;GACO;GACL,YAAA;GACA,YAAY;GACN;GACN,GAAI;GACJ,SAAA;aAEA,kBAAC,EAAO,KAAR;IACE,SAAS;KAAE,SAAS;KAAG,OAAO;KAAM,GAAG;KAAW;IAClD,SAAS;KAAE,SAAS;KAAG,OAAO;KAAG,GAAG;KAAG,GAAG;KAAG;IAC7C,MAAM;KAAE,SAAS;KAAG,OAAO;KAAM,GAAG;KAAW;IAC/C,YAAY;KAAE,GAAG,EAAQ;KAAQ,SAAS,EAAO;KAAM;IACvD,WAAW,EACT,2IACA,EACD;IAEA;IACU,CAAA;GACY,CAAA;EACH,CAAA,EAEZ,CAAA;EAEpB;AACF,EAAe,cAAA,EAAuC"}
1
+ {"version":3,"file":"tooltip.js","names":[],"sources":["../../src/ui/tooltip.tsx"],"sourcesContent":["'use client'\n\nimport * as TooltipPrimitive from '@primitives/react-tooltip'\nimport { AnimatePresence,motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { springs, tweens } from './lib/motion'\nimport { useControllableOpen } from './lib/use-controllable-open'\nimport { cn } from './lib/utils'\n\n// ── Auto-provider: wraps with TooltipPrimitive.Provider if none exists ──\n\nconst TooltipProviderContext = React.createContext(false)\n\nconst TooltipProvider: React.FC<React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Provider>> = ({\n children,\n ...props\n}) => (\n <TooltipProviderContext.Provider value={true}>\n <TooltipPrimitive.Provider {...props}>\n {children}\n </TooltipPrimitive.Provider>\n </TooltipProviderContext.Provider>\n)\n\nfunction AutoProvider({ children }: { children: React.ReactNode }) {\n const hasProvider = React.useContext(TooltipProviderContext)\n if (hasProvider) return <>{children}</>\n return (\n <TooltipProviderContext.Provider value={true}>\n <TooltipPrimitive.Provider delayDuration={300}>\n {children}\n </TooltipPrimitive.Provider>\n </TooltipProviderContext.Provider>\n )\n}\n\n// ── Internal context to thread `open` state to animated children ──\n\ntype TooltipContextValue = { open: boolean }\nconst TooltipContext = React.createContext<TooltipContextValue>({ open: false })\n\nconst Tooltip: React.FC<React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>> = ({\n open: openProp,\n defaultOpen,\n onOpenChange,\n ...props\n}) => {\n const { open, setOpen } = useControllableOpen({ open: openProp, defaultOpen, onOpenChange })\n\n const contextValue = React.useMemo(() => ({ open }), [open])\n\n return (\n <AutoProvider>\n <TooltipContext.Provider value={contextValue}>\n <TooltipPrimitive.Root open={open} onOpenChange={setOpen} {...props} />\n </TooltipContext.Provider>\n </AutoProvider>\n )\n}\nTooltip.displayName = 'Tooltip'\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\n// ── Side-based slide offsets ──\n\nconst sideOffset: Record<string, { x?: number; y?: number }> = {\n top: { y: 4 },\n bottom: { y: -4 },\n left: { x: 4 },\n right: { x: -4 },\n}\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset: sideOffsetProp = 4, side = 'top', children, ...props }, ref) => {\n const { open } = React.useContext(TooltipContext)\n const slideInit = sideOffset[side] ?? {}\n\n return (\n <AnimatePresence>\n {open && (\n <TooltipPrimitive.Portal forceMount>\n <TooltipPrimitive.Content\n ref={ref}\n forceMount\n sideOffset={sideOffsetProp}\n side={side}\n {...props}\n asChild\n >\n <motion.div\n initial={{ opacity: 0, scale: 0.95, ...slideInit }}\n animate={{ opacity: 1, scale: 1, x: 0, y: 0 }}\n exit={{ opacity: 0, scale: 0.95, ...slideInit }}\n transition={{ ...springs.snappy, opacity: tweens.fade }}\n className={cn(\n 'z-tooltip overflow-hidden rounded-overlay-sm bg-surface-inverted px-ds-04 py-ds-02b text-ds-sm text-surface-inverted-fg shadow-floating',\n className,\n )}\n >\n {children}\n </motion.div>\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )}\n </AnimatePresence>\n )\n})\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport type TooltipContentProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n\nexport { Tooltip, TooltipContent, TooltipProvider,TooltipTrigger }\n"],"mappings":";;;;;;;;;AAYA,IAAM,IAAyB,EAAM,cAAc,EAAK,GAElD,KAA+F,EACnG,aACA,GAAG,QAEH,kBAAC,EAAuB,UAAxB;CAAiC,OAAO;WACtC,kBAAC,GAAD;EAA2B,GAAI;EAC5B;CACwB,CAAA;AACI,CAAA;AAGnC,SAAS,EAAa,EAAE,eAA2C;CAGjE,OAFoB,EAAM,WAAW,CACjC,IAAoB,kBAAA,GAAA,EAAG,YAAW,CAAA,IAEpC,kBAAC,EAAuB,UAAxB;EAAiC,OAAO;YACtC,kBAAC,GAAD;GAA2B,eAAe;GACvC;EACwB,CAAA;CACI,CAAA;AAErC;AAKA,IAAM,IAAiB,EAAM,cAAmC,EAAE,MAAM,GAAM,CAAC,GAEzE,KAAmF,EACvF,MAAM,GACN,gBACA,iBACA,GAAG,QACC;CACJ,IAAM,EAAE,SAAM,eAAY,EAAoB;EAAE,MAAM;EAAU;EAAa;CAAa,CAAC,GAErF,IAAe,EAAM,eAAe,EAAE,QAAK,IAAI,CAAC,CAAI,CAAC;CAE3D,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,EAAe,UAAhB;EAAyB,OAAO;YAC9B,kBAAC,GAAD;GAA6B;GAAM,cAAc;GAAS,GAAI;EAAQ,CAAA;CAC/C,CAAA,EACb,CAAA;AAElB;AACA,EAAQ,cAAc;AAEtB,IAAM,IAAiB,GAIjB,IAAyD;CAC7D,KAAK,EAAE,GAAG,EAAE;CACZ,QAAQ,EAAE,GAAG,GAAG;CAChB,MAAM,EAAE,GAAG,EAAE;CACb,OAAO,EAAE,GAAG,GAAG;AACjB,GAEM,IAAiB,EAAM,YAG1B,EAAE,cAAW,YAAY,IAAiB,GAAG,UAAO,OAAO,aAAU,GAAG,KAAS,MAAQ;CAC1F,IAAM,EAAE,YAAS,EAAM,WAAW,CAAc,GAC1C,IAAY,EAAW,MAAS,CAAC;CAEvC,OACE,kBAAC,GAAD,EAAA,UACG,KACC,kBAAC,GAAD;EAAyB,YAAA;YACvB,kBAAC,GAAD;GACO;GACL,YAAA;GACA,YAAY;GACN;GACN,GAAI;GACJ,SAAA;aAEA,kBAAC,EAAO,KAAR;IACE,SAAS;KAAE,SAAS;KAAG,OAAO;KAAM,GAAG;IAAU;IACjD,SAAS;KAAE,SAAS;KAAG,OAAO;KAAG,GAAG;KAAG,GAAG;IAAE;IAC5C,MAAM;KAAE,SAAS;KAAG,OAAO;KAAM,GAAG;IAAU;IAC9C,YAAY;KAAE,GAAG,EAAQ;KAAQ,SAAS,EAAO;IAAK;IACtD,WAAW,EACT,2IACA,CACF;IAEC;GACS,CAAA;EACY,CAAA;CACH,CAAA,EAEZ,CAAA;AAErB,CAAC;AACD,EAAe,cAAA,EAAuC"}
@@ -1 +1 @@
1
- {"version":3,"file":"truncated-text.js","names":[],"sources":["../../src/ui/truncated-text.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\n\nimport { cn } from './lib/utils'\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip'\n\ntype TruncateMode = 'end' | 'clamp' | 'middle'\n\nexport interface TruncatedTextProps {\n /** The full text. Always the accessible name, even when visually shortened. */\n children: string\n /**\n * `end` (default) single-line \"…end\"; `clamp` multi-line (`lines`); `middle`\n * keeps both ends (filenames, emails) — `name…end.pdf`.\n */\n mode?: TruncateMode\n /** Lines for `mode=\"clamp\"`. @default 2 */\n lines?: number\n /** Element to render. @default 'span' */\n as?: 'span' | 'p' | 'div'\n /** Show the full text in a tooltip when (and only when) actually truncated. @default true */\n tooltip?: boolean\n className?: string\n /** Override the full-text accessible name / tooltip (defaults to `children`). */\n title?: string\n}\n\n/** Keep `keep` chars total, ellipsis in the middle. */\nfunction truncateMiddle(str: string, keep: number, ellipsis = '…'): string {\n if (keep >= str.length || keep < 2) return str\n const budget = keep - ellipsis.length\n const head = Math.ceil(budget / 2)\n const tail = Math.floor(budget / 2)\n // slice(-0) returns the whole string, so guard the tail explicitly.\n return str.slice(0, head) + ellipsis + (tail > 0 ? str.slice(-tail) : '')\n}\n\n/**\n * Text that truncates and recovers. CSS handles `end`/`clamp` (full text stays in the\n * DOM, screen-reader safe); `middle` measures + JS-shortens but keeps the full string as\n * the accessible name. A tooltip appears ONLY when the text is actually clipped.\n *\n * Note: for `end`/`middle` in a flex/grid row, the shrinking item still needs `min-w-0`\n * (CSS gotcha) — apply it at the call site.\n *\n * @example\n * <TruncatedText>{user.name}</TruncatedText>\n * <TruncatedText mode=\"middle\">{fileName}</TruncatedText> // report…v2.pdf\n * <TruncatedText mode=\"clamp\" lines={2}>{description}</TruncatedText>\n */\nexport const TruncatedText = React.forwardRef<HTMLElement, TruncatedTextProps>(\n ({ children, mode = 'end', lines = 2, as = 'span', tooltip = true, className, title }, forwardedRef) => {\n const full = children\n const [overflowing, setOverflowing] = React.useState(false)\n const [display, setDisplay] = React.useState(full)\n const roRef = React.useRef<ResizeObserver | null>(null)\n\n // Callback ref owns the ResizeObserver so it always tracks the CURRENT node.\n // Wrapping in a Tooltip remounts the element when `overflowing` flips — a one-shot\n // layout effect would leave a stale observer on the detached node (which then fires\n // with size 0 and resets the measurement). Reconnecting here avoids that loop.\n const attachRef = React.useCallback(\n (node: HTMLElement | null) => {\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef) (forwardedRef as React.MutableRefObject<HTMLElement | null>).current = node\n\n roRef.current?.disconnect()\n if (!node) return\n\n const measure = () => {\n if (mode === 'middle') {\n node.textContent = full\n if (node.clientWidth === 0 || node.scrollWidth <= node.clientWidth) {\n setDisplay(full)\n setOverflowing(false)\n return\n }\n // Largest middle-truncated string that fits, via binary search.\n let lo = 2\n let hi = full.length\n let best = 2\n while (lo <= hi) {\n const midKeep = (lo + hi) >> 1\n node.textContent = truncateMiddle(full, midKeep)\n if (node.scrollWidth <= node.clientWidth) {\n best = midKeep\n lo = midKeep + 1\n } else {\n hi = midKeep - 1\n }\n }\n setDisplay(truncateMiddle(full, best))\n setOverflowing(true)\n } else if (mode === 'clamp') {\n setOverflowing(node.scrollHeight > node.clientHeight + 1)\n } else {\n setOverflowing(node.scrollWidth > node.clientWidth + 1)\n }\n }\n\n measure()\n roRef.current = new ResizeObserver(measure)\n roRef.current.observe(node)\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [full, mode, lines, forwardedRef],\n )\n\n const Tag = as as React.ElementType\n const content = (\n <Tag\n ref={attachRef}\n className={cn(\n mode === 'end' && 'block truncate',\n mode === 'middle' && 'block overflow-hidden whitespace-nowrap',\n mode === 'clamp' && 'overflow-hidden',\n className,\n )}\n style={\n mode === 'clamp'\n ? ({ display: '-webkit-box', WebkitBoxOrient: 'vertical', WebkitLineClamp: lines } as React.CSSProperties)\n : undefined\n }\n // When clipped, the visible text may be shortened (middle mode) — keep the full\n // string as the accessible name so screen readers always read it in full.\n aria-label={overflowing ? (title ?? full) : undefined}\n >\n {mode === 'middle' ? display : full}\n </Tag>\n )\n\n if (tooltip && overflowing) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent>{title ?? full}</TooltipContent>\n </Tooltip>\n )\n }\n return content\n },\n)\nTruncatedText.displayName = 'TruncatedText'\n"],"mappings":";;;;;;AA6BA,SAAS,EAAe,GAAa,GAAc,IAAW,KAAa;AACzE,KAAI,KAAQ,EAAI,UAAU,IAAO,EAAG,QAAO;CAC3C,IAAM,IAAS,IAAO,EAAS,QACzB,IAAO,KAAK,KAAK,IAAS,EAAE,EAC5B,IAAO,KAAK,MAAM,IAAS,EAAE;AAEnC,QAAO,EAAI,MAAM,GAAG,EAAK,GAAG,KAAY,IAAO,IAAI,EAAI,MAAM,CAAC,EAAK,GAAG;;AAgBxE,IAAa,IAAgB,EAAM,YAChC,EAAE,aAAU,UAAO,OAAO,WAAQ,GAAG,QAAK,QAAQ,aAAU,IAAM,cAAW,YAAS,MAAiB;CACtG,IAAM,IAAO,GACP,CAAC,GAAa,KAAkB,EAAM,SAAS,GAAM,EACrD,CAAC,GAAS,KAAc,EAAM,SAAS,EAAK,EAC5C,IAAQ,EAAM,OAA8B,KAAK,EAsDjD,IACJ,kBAFU,GAEV;EACE,KAlDc,EAAM,aACrB,MAA6B;AAK5B,OAJI,OAAO,KAAiB,aAAY,EAAa,EAAK,GACjD,MAAe,EAA4D,UAAU,IAE9F,EAAM,SAAS,YAAY,EACvB,CAAC,EAAM;GAEX,IAAM,UAAgB;AACpB,QAAI,MAAS,UAAU;AAErB,SADA,EAAK,cAAc,GACf,EAAK,gBAAgB,KAAK,EAAK,eAAe,EAAK,aAAa;AAElE,MADA,EAAW,EAAK,EAChB,EAAe,GAAM;AACrB;;KAGF,IAAI,IAAK,GACL,IAAK,EAAK,QACV,IAAO;AACX,YAAO,KAAM,IAAI;MACf,IAAM,IAAW,IAAK,KAAO;AAE7B,MADA,EAAK,cAAc,EAAe,GAAM,EAAQ,EAC5C,EAAK,eAAe,EAAK,eAC3B,IAAO,GACP,IAAK,IAAU,KAEf,IAAK,IAAU;;AAInB,KADA,EAAW,EAAe,GAAM,EAAK,CAAC,EACtC,EAAe,GAAK;WAEpB,EADS,MAAS,UACH,EAAK,eAAe,EAAK,eAAe,IAExC,EAAK,cAAc,EAAK,cAAc,EAAE;;AAM3D,GAFA,GAAS,EACT,EAAM,UAAU,IAAI,eAAe,EAAQ,EAC3C,EAAM,QAAQ,QAAQ,EAAK;KAG7B;GAAC;GAAM;GAAM;GAAO;GAAa,CAClC;EAMG,WAAW,EACT,MAAS,SAAS,kBAClB,MAAS,YAAY,2CACrB,MAAS,WAAW,mBACpB,EACD;EACD,OACE,MAAS,UACJ;GAAE,SAAS;GAAe,iBAAiB;GAAY,iBAAiB;GAAO,GAChF,KAAA;EAIN,cAAY,IAAe,KAAS,IAAQ,KAAA;YAE3C,MAAS,WAAW,IAAU;EAC3B,CAAA;AAWR,QARI,KAAW,IAEX,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EAAgB,SAAA;YAAS;EAAyB,CAAA,EAClD,kBAAC,GAAD,EAAA,UAAiB,KAAS,GAAsB,CAAA,CACxC,EAAA,CAAA,GAGP;EAEV;AACD,EAAc,cAAc"}
1
+ {"version":3,"file":"truncated-text.js","names":[],"sources":["../../src/ui/truncated-text.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\n\nimport { cn } from './lib/utils'\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip'\n\ntype TruncateMode = 'end' | 'clamp' | 'middle'\n\nexport interface TruncatedTextProps {\n /** The full text. Always the accessible name, even when visually shortened. */\n children: string\n /**\n * `end` (default) single-line \"…end\"; `clamp` multi-line (`lines`); `middle`\n * keeps both ends (filenames, emails) — `name…end.pdf`.\n */\n mode?: TruncateMode\n /** Lines for `mode=\"clamp\"`. @default 2 */\n lines?: number\n /** Element to render. @default 'span' */\n as?: 'span' | 'p' | 'div'\n /** Show the full text in a tooltip when (and only when) actually truncated. @default true */\n tooltip?: boolean\n className?: string\n /** Override the full-text accessible name / tooltip (defaults to `children`). */\n title?: string\n}\n\n/** Keep `keep` chars total, ellipsis in the middle. */\nfunction truncateMiddle(str: string, keep: number, ellipsis = '…'): string {\n if (keep >= str.length || keep < 2) return str\n const budget = keep - ellipsis.length\n const head = Math.ceil(budget / 2)\n const tail = Math.floor(budget / 2)\n // slice(-0) returns the whole string, so guard the tail explicitly.\n return str.slice(0, head) + ellipsis + (tail > 0 ? str.slice(-tail) : '')\n}\n\n/**\n * Text that truncates and recovers. CSS handles `end`/`clamp` (full text stays in the\n * DOM, screen-reader safe); `middle` measures + JS-shortens but keeps the full string as\n * the accessible name. A tooltip appears ONLY when the text is actually clipped.\n *\n * Note: for `end`/`middle` in a flex/grid row, the shrinking item still needs `min-w-0`\n * (CSS gotcha) — apply it at the call site.\n *\n * @example\n * <TruncatedText>{user.name}</TruncatedText>\n * <TruncatedText mode=\"middle\">{fileName}</TruncatedText> // report…v2.pdf\n * <TruncatedText mode=\"clamp\" lines={2}>{description}</TruncatedText>\n */\nexport const TruncatedText = React.forwardRef<HTMLElement, TruncatedTextProps>(\n ({ children, mode = 'end', lines = 2, as = 'span', tooltip = true, className, title }, forwardedRef) => {\n const full = children\n const [overflowing, setOverflowing] = React.useState(false)\n const [display, setDisplay] = React.useState(full)\n const roRef = React.useRef<ResizeObserver | null>(null)\n\n // Callback ref owns the ResizeObserver so it always tracks the CURRENT node.\n // Wrapping in a Tooltip remounts the element when `overflowing` flips — a one-shot\n // layout effect would leave a stale observer on the detached node (which then fires\n // with size 0 and resets the measurement). Reconnecting here avoids that loop.\n const attachRef = React.useCallback(\n (node: HTMLElement | null) => {\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef) (forwardedRef as React.MutableRefObject<HTMLElement | null>).current = node\n\n roRef.current?.disconnect()\n if (!node) return\n\n const measure = () => {\n if (mode === 'middle') {\n node.textContent = full\n if (node.clientWidth === 0 || node.scrollWidth <= node.clientWidth) {\n setDisplay(full)\n setOverflowing(false)\n return\n }\n // Largest middle-truncated string that fits, via binary search.\n let lo = 2\n let hi = full.length\n let best = 2\n while (lo <= hi) {\n const midKeep = (lo + hi) >> 1\n node.textContent = truncateMiddle(full, midKeep)\n if (node.scrollWidth <= node.clientWidth) {\n best = midKeep\n lo = midKeep + 1\n } else {\n hi = midKeep - 1\n }\n }\n setDisplay(truncateMiddle(full, best))\n setOverflowing(true)\n } else if (mode === 'clamp') {\n setOverflowing(node.scrollHeight > node.clientHeight + 1)\n } else {\n setOverflowing(node.scrollWidth > node.clientWidth + 1)\n }\n }\n\n measure()\n roRef.current = new ResizeObserver(measure)\n roRef.current.observe(node)\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [full, mode, lines, forwardedRef],\n )\n\n const Tag = as as React.ElementType\n const content = (\n <Tag\n ref={attachRef}\n className={cn(\n mode === 'end' && 'block truncate',\n mode === 'middle' && 'block overflow-hidden whitespace-nowrap',\n mode === 'clamp' && 'overflow-hidden',\n className,\n )}\n style={\n mode === 'clamp'\n ? ({ display: '-webkit-box', WebkitBoxOrient: 'vertical', WebkitLineClamp: lines } as React.CSSProperties)\n : undefined\n }\n // When clipped, the visible text may be shortened (middle mode) — keep the full\n // string as the accessible name so screen readers always read it in full.\n aria-label={overflowing ? (title ?? full) : undefined}\n >\n {mode === 'middle' ? display : full}\n </Tag>\n )\n\n if (tooltip && overflowing) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent>{title ?? full}</TooltipContent>\n </Tooltip>\n )\n }\n return content\n },\n)\nTruncatedText.displayName = 'TruncatedText'\n"],"mappings":";;;;;;AA6BA,SAAS,EAAe,GAAa,GAAc,IAAW,KAAa;CACzE,IAAI,KAAQ,EAAI,UAAU,IAAO,GAAG,OAAO;CAC3C,IAAM,IAAS,IAAO,EAAS,QACzB,IAAO,KAAK,KAAK,IAAS,CAAC,GAC3B,IAAO,KAAK,MAAM,IAAS,CAAC;CAElC,OAAO,EAAI,MAAM,GAAG,CAAI,IAAI,KAAY,IAAO,IAAI,EAAI,MAAM,CAAC,CAAI,IAAI;AACxE;AAeA,IAAa,IAAgB,EAAM,YAChC,EAAE,aAAU,UAAO,OAAO,WAAQ,GAAG,QAAK,QAAQ,aAAU,IAAM,cAAW,YAAS,MAAiB;CACtG,IAAM,IAAO,GACP,CAAC,GAAa,KAAkB,EAAM,SAAS,EAAK,GACpD,CAAC,GAAS,KAAc,EAAM,SAAS,CAAI,GAC3C,IAAQ,EAAM,OAA8B,IAAI,GAsDhD,IACJ,kBAAC,GAAD;EACE,KAlDc,EAAM,aACrB,MAA6B;GAK5B,IAJI,OAAO,KAAiB,aAAY,EAAa,CAAI,IAChD,MAAc,EAA6D,UAAU,IAE9F,EAAM,SAAS,WAAW,GACtB,CAAC,GAAM;GAEX,IAAM,UAAgB;IACpB,IAAI,MAAS,UAAU;KAErB,IADA,EAAK,cAAc,GACf,EAAK,gBAAgB,KAAK,EAAK,eAAe,EAAK,aAAa;MAElE,AADA,EAAW,CAAI,GACf,EAAe,EAAK;MACpB;KACF;KAEA,IAAI,IAAK,GACL,IAAK,EAAK,QACV,IAAO;KACX,OAAO,KAAM,IAAI;MACf,IAAM,IAAW,IAAK,KAAO;MAE7B,AADA,EAAK,cAAc,EAAe,GAAM,CAAO,GAC3C,EAAK,eAAe,EAAK,eAC3B,IAAO,GACP,IAAK,IAAU,KAEf,IAAK,IAAU;KAEnB;KAEA,AADA,EAAW,EAAe,GAAM,CAAI,CAAC,GACrC,EAAe,EAAI;IACrB,OAAO,AACL,EADS,MAAS,UACH,EAAK,eAAe,EAAK,eAAe,IAExC,EAAK,cAAc,EAAK,cAAc,CAAC;GAE1D;GAIA,AAFA,EAAQ,GACR,EAAM,UAAU,IAAI,eAAe,CAAO,GAC1C,EAAM,QAAQ,QAAQ,CAAI;EAC5B,GAEA;GAAC;GAAM;GAAM;GAAO;EAAY,CAMzB;EACL,WAAW,EACT,MAAS,SAAS,kBAClB,MAAS,YAAY,2CACrB,MAAS,WAAW,mBACpB,CACF;EACA,OACE,MAAS,UACJ;GAAE,SAAS;GAAe,iBAAiB;GAAY,iBAAiB;EAAM,IAC/E,KAAA;EAIN,cAAY,IAAe,KAAS,IAAQ,KAAA;YAE3C,MAAS,WAAW,IAAU;CAC5B,CAAA;CAWP,OARI,KAAW,IAEX,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EAAgB,SAAA;YAAS;CAAwB,CAAA,GACjD,kBAAC,GAAD,EAAA,UAAiB,KAAS,EAAqB,CAAA,CACxC,EAAA,CAAA,IAGN;AACT,CACF;AACA,EAAc,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"visually-hidden.js","names":[],"sources":["../../src/ui/visually-hidden.tsx"],"sourcesContent":["// @server-safe\nimport * as React from 'react'\n\nimport { cn } from './lib/utils'\n\nexport interface VisuallyHiddenProps\n extends React.HTMLAttributes<HTMLSpanElement> {}\n\nconst VisuallyHidden = React.forwardRef<HTMLSpanElement, VisuallyHiddenProps>(\n ({ className, ...props }, ref) => {\n return <span ref={ref} className={cn('sr-only', className)} {...props} />\n },\n)\nVisuallyHidden.displayName = 'VisuallyHidden'\n\nexport { VisuallyHidden }\n"],"mappings":";;;;AAQA,IAAM,IAAiB,EAAM,YAC1B,EAAE,cAAW,GAAG,KAAS,MACjB,kBAAC,QAAD;CAAW;CAAK,WAAW,EAAG,WAAW,EAAU;CAAE,GAAI;CAAS,CAAA,CAE5E;AACD,EAAe,cAAc"}
1
+ {"version":3,"file":"visually-hidden.js","names":[],"sources":["../../src/ui/visually-hidden.tsx"],"sourcesContent":["// @server-safe\nimport * as React from 'react'\n\nimport { cn } from './lib/utils'\n\nexport interface VisuallyHiddenProps\n extends React.HTMLAttributes<HTMLSpanElement> {}\n\nconst VisuallyHidden = React.forwardRef<HTMLSpanElement, VisuallyHiddenProps>(\n ({ className, ...props }, ref) => {\n return <span ref={ref} className={cn('sr-only', className)} {...props} />\n },\n)\nVisuallyHidden.displayName = 'VisuallyHidden'\n\nexport { VisuallyHidden }\n"],"mappings":";;;;AAQA,IAAM,IAAiB,EAAM,YAC1B,EAAE,cAAW,GAAG,KAAS,MACjB,kBAAC,QAAD;CAAW;CAAK,WAAW,EAAG,WAAW,CAAS;CAAG,GAAI;AAAQ,CAAA,CAE5E;AACA,EAAe,cAAc"}
@@ -32,7 +32,7 @@
32
32
  editable: boolean — enable double-click cell editing
33
33
  virtualRows: boolean — virtualize rows for large datasets
34
34
  columnPinning: { left?: string[], right?: string[] }
35
- defaultDensity: 'compact' | 'standard' | 'comfortable'
35
+ density: 'compact' | 'standard' | 'comfortable'
36
36
 
37
37
  ## Defaults
38
38
  pageSize=10, noResultsText="No results."
@@ -86,7 +86,7 @@ import { DataTable } from '@devalok/shilp-sutra/ui/data-table'
86
86
  - When pagination prop is provided, pagination is manual — pass total count
87
87
  - selectedIds syncs via useEffect — provide getRowId for custom row IDs
88
88
  - onRowClick does NOT fire when clicking checkboxes, buttons, links, or inputs
89
- - Use defaultDensity="compact" for Karm-style h-9 rows
89
+ - Use density="compact" for Karm-style h-9 rows
90
90
  - `virtualRows={true}` requires a bounded scroll container — unbounded height silently disables virtualization
91
91
 
92
92
  ## Changes
package/llms.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # @devalok/shilp-sutra
2
2
 
3
- > Radix UI + Tailwind 4 (CSS-first) + CVA design system for Devalok apps, v0.49.3.
3
+ > Radix UI + Tailwind 4 (CSS-first) + CVA design system for Devalok apps, v0.49.5.
4
4
  > Built on the same primitives as shadcn/ui but with DIFFERENT prop APIs — never guess from shadcn knowledge; verify every prop.
5
5
  > This file is a ROUTER: it tells you what exists and where to get details. Do not look for prop tables here — fetch them per component (MCP tool or per-component doc file below).
6
6
 
package/mcp-manifest.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "$schema": "./mcp-manifest.schema.json",
3
3
  "manifestVersion": "1.2.0",
4
4
  "package": "@devalok/shilp-sutra",
5
- "packageVersion": "0.49.3",
5
+ "packageVersion": "0.49.5",
6
6
  "components": {
7
7
  "accordion": {
8
8
  "displayName": "Accordion",
@@ -2756,7 +2756,7 @@
2756
2756
  },
2757
2757
  "required": false
2758
2758
  },
2759
- "defaultDensity": {
2759
+ "density": {
2760
2760
  "type": {
2761
2761
  "name": "enum",
2762
2762
  "value": [
@@ -2798,7 +2798,7 @@
2798
2798
  "When pagination prop is provided, pagination is manual — pass total count",
2799
2799
  "selectedIds syncs via useEffect — provide getRowId for custom row IDs",
2800
2800
  "onRowClick does NOT fire when clicking checkboxes, buttons, links, or inputs",
2801
- "Use defaultDensity=\"compact\" for Karm-style h-9 rows",
2801
+ "Use density=\"compact\" for Karm-style h-9 rows",
2802
2802
  "`virtualRows={true}` requires a bounded scroll container — unbounded height silently disables virtualization"
2803
2803
  ],
2804
2804
  "changes": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devalok/shilp-sutra",
3
- "version": "0.49.3",
3
+ "version": "0.49.5",
4
4
  "description": "Devalok Design System — accessible React components, OKLCH design tokens, and Tailwind 4 CSS-first setup. Ships with AI-agent setup recipes.",
5
5
  "license": "MIT",
6
6
  "author": "Devalok Design & Strategy Studios <shilp-sutra@devalok.in>",
@@ -57,7 +57,7 @@
57
57
  "clsx": "^2.1.1",
58
58
  "frimousse": "^0.3.0",
59
59
  "tw-animate-css": "^1.4.0",
60
- "use-sync-external-store": "^1.5.0"
60
+ "use-sync-external-store": "^1.6.0"
61
61
  },
62
62
  "exports": {
63
63
  ".": {
@@ -936,21 +936,21 @@
936
936
  "devDependencies": {
937
937
  "@emoji-mart/data": "^1.2.1",
938
938
  "@emoji-mart/react": "^1.1.1",
939
- "@floating-ui/dom": "^1.7.6",
940
- "@floating-ui/react-dom": "^2.1.8",
941
- "@tabler/icons-react": "^3.42.0",
939
+ "@floating-ui/dom": "^1.8.0",
940
+ "@floating-ui/react-dom": "^2.1.9",
941
+ "@tabler/icons-react": "^3.45.0",
942
942
  "@tanstack/react-table": "^8.21.3",
943
- "@tanstack/react-virtual": "^3.13.23",
944
- "@tiptap/core": "^3.22.5",
945
- "@tiptap/extension-highlight": "^3.22.5",
946
- "@tiptap/extension-image": "^3.22.5",
947
- "@tiptap/extension-list": "^3.22.5",
948
- "@tiptap/extension-mention": "^3.22.5",
949
- "@tiptap/extension-text-align": "^3.22.5",
950
- "@tiptap/extensions": "^3.22.5",
951
- "@tiptap/react": "^3.22.5",
952
- "@tiptap/starter-kit": "^3.22.5",
953
- "@tiptap/suggestion": "^3.22.5",
943
+ "@tanstack/react-virtual": "^3.14.7",
944
+ "@tiptap/core": "^3.28.0",
945
+ "@tiptap/extension-highlight": "^3.28.0",
946
+ "@tiptap/extension-image": "^3.28.0",
947
+ "@tiptap/extension-list": "^3.28.0",
948
+ "@tiptap/extension-mention": "^3.28.0",
949
+ "@tiptap/extension-text-align": "^3.28.0",
950
+ "@tiptap/extensions": "^3.28.0",
951
+ "@tiptap/react": "^3.28.0",
952
+ "@tiptap/starter-kit": "^3.28.0",
953
+ "@tiptap/suggestion": "^3.28.0",
954
954
  "@types/react-syntax-highlighter": "^15.5.13",
955
955
  "aria-hidden": "^1.2.6",
956
956
  "class-variance-authority": "^0.7.1",
@@ -964,12 +964,12 @@
964
964
  "d3-shape": "^3.2.0",
965
965
  "d3-time-format": "^4.1.0",
966
966
  "d3-transition": "^3.0.1",
967
- "date-fns": "^4.1.0",
968
- "esbuild": "^0.28.0",
969
- "framer-motion": "^12.38.0",
967
+ "date-fns": "^4.4.0",
968
+ "esbuild": "^0.28.1",
969
+ "framer-motion": "^12.42.2",
970
970
  "input-otp": "^1.4.2",
971
971
  "prosemirror-state": "^1.4.4",
972
- "react-colorful": "^5.6.1",
972
+ "react-colorful": "^5.8.0",
973
973
  "react-markdown": "^10.1.0",
974
974
  "react-pdf": "^10.4.1",
975
975
  "react-remove-scroll": "^2.7.2",
@@ -977,7 +977,7 @@
977
977
  "react-zoom-pan-pinch": "^4.0.3",
978
978
  "remark-gfm": "^4.0.1",
979
979
  "sonner": "^2.0.7",
980
- "tailwind-merge": "^3.5.0"
980
+ "tailwind-merge": "^3.6.0"
981
981
  },
982
982
  "scripts": {
983
983
  "build": "vite build && node scripts/post-build.mjs",
package/skill/SKILL.md CHANGED
@@ -3,7 +3,7 @@ name: shilp-sutra
3
3
  description: Add, configure, and use components from Devalok's shilp-sutra design system (@devalok/shilp-sutra) — a Tailwind 4 + React 19 + CVA library with 110+ accessible components, OKLCH design tokens, framer-motion animations, and per-component RSC-safe entry points. Use this skill whenever the user mentions shilp-sutra, Devalok, the @devalok npm scope, or asks to install/add/style/theme UI in any React project that already depends on the package — even if they don't name it explicitly. Use it instead of generic shadcn/ui, MUI, or Chakra knowledge when shilp-sutra is in the project. Covers Next.js (App + Pages), Vite, Astro, Remix, TanStack Start setup playbooks; component API and variant reference; brand token customization; Server Component import patterns; and a troubleshoot tree for the thirteen most common breakages.
4
4
  license: MIT
5
5
  metadata:
6
- version: "0.49.3"
6
+ version: "0.49.5"
7
7
  author: Devalok Design & Strategy Studios
8
8
  homepage: https://github.com/devalok-design/shilp-sutra
9
9
  npm: https://www.npmjs.com/package/@devalok/shilp-sutra
@@ -2,7 +2,7 @@
2
2
 
3
3
  # @devalok/shilp-sutra
4
4
 
5
- > Radix UI + Tailwind 4 (CSS-first) + CVA design system for Devalok apps, v0.49.3.
5
+ > Radix UI + Tailwind 4 (CSS-first) + CVA design system for Devalok apps, v0.49.5.
6
6
  > Built on the same primitives as shadcn/ui but with DIFFERENT prop APIs — never guess from shadcn knowledge; verify every prop.
7
7
  > This file is a ROUTER: it tells you what exists and where to get details. Do not look for prop tables here — fetch them per component (MCP tool or per-component doc file below).
8
8