@ds-mo/ui 14.13.0 → 14.15.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 (246) hide show
  1. package/README.md +10 -2
  2. package/dist/.package-ready.json +1 -1
  3. package/dist/agent-patterns.json +50 -1
  4. package/dist/agent.json +107 -6
  5. package/dist/angular/ds-input.d.ts +1 -1
  6. package/dist/angular/ds-input.js +3 -3
  7. package/dist/components/ds-input.js +1 -1
  8. package/dist/components/ds-paper-texture.js +1 -1
  9. package/dist/components/ds-shell-app.js +1 -1
  10. package/dist/components/ds-table-saved-views.js +1 -1
  11. package/dist/components/{p-DIEx1e0M.js → p-B80NfEqc.js} +2 -2
  12. package/dist/components/p-B80NfEqc.js.map +1 -0
  13. package/dist/components/{p-iBuPFJL9.js → p-CKY989vF.js} +2 -2
  14. package/dist/components/p-CKY989vF.js.map +1 -0
  15. package/dist/docs/components.json +86 -4
  16. package/dist/mcp/cli.js +19 -4
  17. package/dist/mcp-data/registry/agent-activity.json +6 -1
  18. package/dist/mcp-data/registry/agent-questionnaire.json +6 -1
  19. package/dist/mcp-data/registry/agent-response.json +6 -1
  20. package/dist/mcp-data/registry/agent-source-list.json +6 -1
  21. package/dist/mcp-data/registry/agent-tool-call.json +6 -1
  22. package/dist/mcp-data/registry/attachment-list.json +6 -1
  23. package/dist/mcp-data/registry/avatar.json +6 -1
  24. package/dist/mcp-data/registry/badge.json +6 -1
  25. package/dist/mcp-data/registry/banner.json +6 -1
  26. package/dist/mcp-data/registry/bar-action.json +6 -1
  27. package/dist/mcp-data/registry/bar-nav.json +6 -1
  28. package/dist/mcp-data/registry/bar-title.json +6 -1
  29. package/dist/mcp-data/registry/bar-workflow.json +6 -1
  30. package/dist/mcp-data/registry/breadcrumb.json +6 -1
  31. package/dist/mcp-data/registry/button-filled.json +6 -1
  32. package/dist/mcp-data/registry/button-unfilled.json +6 -1
  33. package/dist/mcp-data/registry/card-chart.json +6 -1
  34. package/dist/mcp-data/registry/card-overview.json +6 -1
  35. package/dist/mcp-data/registry/card-setting.json +6 -1
  36. package/dist/mcp-data/registry/chart-legend.json +6 -1
  37. package/dist/mcp-data/registry/chart.json +6 -1
  38. package/dist/mcp-data/registry/checkbox.json +9 -1
  39. package/dist/mcp-data/registry/chip.json +6 -1
  40. package/dist/mcp-data/registry/code-block.json +6 -1
  41. package/dist/mcp-data/registry/conversation-list-item.json +6 -1
  42. package/dist/mcp-data/registry/conversation-list-section.json +6 -1
  43. package/dist/mcp-data/registry/conversation-list.json +6 -1
  44. package/dist/mcp-data/registry/divider.json +6 -1
  45. package/dist/mcp-data/registry/empty-state.json +6 -1
  46. package/dist/mcp-data/registry/field.json +6 -1
  47. package/dist/mcp-data/registry/filter-menu.json +6 -1
  48. package/dist/mcp-data/registry/icon.json +6 -1
  49. package/dist/mcp-data/registry/input.json +65 -8
  50. package/dist/mcp-data/registry/loader.json +6 -1
  51. package/dist/mcp-data/registry/markdown.json +6 -1
  52. package/dist/mcp-data/registry/menu.json +6 -1
  53. package/dist/mcp-data/registry/message-actions.json +6 -1
  54. package/dist/mcp-data/registry/message-bubble.json +6 -1
  55. package/dist/mcp-data/registry/message-composer.json +6 -1
  56. package/dist/mcp-data/registry/message-scroller.json +6 -1
  57. package/dist/mcp-data/registry/message.json +6 -1
  58. package/dist/mcp-data/registry/mobile-bar-nav.json +6 -1
  59. package/dist/mcp-data/registry/mobile-header.json +6 -1
  60. package/dist/mcp-data/registry/mobile-section-switcher.json +6 -1
  61. package/dist/mcp-data/registry/mobile-sheet-nav.json +6 -1
  62. package/dist/mcp-data/registry/modal.json +6 -1
  63. package/dist/mcp-data/registry/pagination.json +6 -1
  64. package/dist/mcp-data/registry/panel-nav.json +6 -1
  65. package/dist/mcp-data/registry/panel-sub-nav.json +6 -1
  66. package/dist/mcp-data/registry/panel-tool-header.json +6 -1
  67. package/dist/mcp-data/registry/panel-tool-search.json +6 -1
  68. package/dist/mcp-data/registry/panel-tools.json +6 -1
  69. package/dist/mcp-data/registry/paper-texture.json +7 -2
  70. package/dist/mcp-data/registry/radio.json +9 -1
  71. package/dist/mcp-data/registry/registry.json +108 -7
  72. package/dist/mcp-data/registry/scroll-overlay.json +6 -1
  73. package/dist/mcp-data/registry/select.json +10 -2
  74. package/dist/mcp-data/registry/shell-app.json +6 -1
  75. package/dist/mcp-data/registry/shell-page.json +6 -1
  76. package/dist/mcp-data/registry/shell-tools.json +6 -1
  77. package/dist/mcp-data/registry/skeleton.json +6 -1
  78. package/dist/mcp-data/registry/slider.json +6 -1
  79. package/dist/mcp-data/registry/swatch-picker.json +6 -1
  80. package/dist/mcp-data/registry/switch.json +9 -1
  81. package/dist/mcp-data/registry/tab-group.json +6 -1
  82. package/dist/mcp-data/registry/table-saved-views.json +6 -1
  83. package/dist/mcp-data/registry/table-toolbar.json +6 -1
  84. package/dist/mcp-data/registry/table.json +6 -1
  85. package/dist/mcp-data/registry/tag.json +6 -1
  86. package/dist/mcp-data/registry/text.json +6 -1
  87. package/dist/mcp-data/registry/toast.json +6 -1
  88. package/dist/mcp-data/registry/tooltip-chart.json +6 -1
  89. package/dist/mcp-data/registry/tooltip.json +6 -1
  90. package/dist/mcp-data/registry/typing-indicator.json +6 -1
  91. package/dist/types/components/Input/Input.d.ts +7 -1
  92. package/dist/types/components/PaperTexture/PaperTexture.d.ts +1 -0
  93. package/dist/types/components.d.ts +27 -0
  94. package/dist/vue/components.d.ts +77 -0
  95. package/dist/vue/components.js +79 -0
  96. package/dist/vue/ds-agent-activity.d.ts +3 -0
  97. package/dist/vue/ds-agent-activity.js +10 -0
  98. package/dist/vue/ds-agent-questionnaire.d.ts +3 -0
  99. package/dist/vue/ds-agent-questionnaire.js +19 -0
  100. package/dist/vue/ds-agent-response.d.ts +3 -0
  101. package/dist/vue/ds-agent-response.js +15 -0
  102. package/dist/vue/ds-agent-source-list.d.ts +3 -0
  103. package/dist/vue/ds-agent-source-list.js +13 -0
  104. package/dist/vue/ds-agent-tool-call.d.ts +3 -0
  105. package/dist/vue/ds-agent-tool-call.js +18 -0
  106. package/dist/vue/ds-attachment-list.d.ts +3 -0
  107. package/dist/vue/ds-attachment-list.js +9 -0
  108. package/dist/vue/ds-avatar.d.ts +3 -0
  109. package/dist/vue/ds-avatar.js +11 -0
  110. package/dist/vue/ds-badge.d.ts +3 -0
  111. package/dist/vue/ds-badge.js +15 -0
  112. package/dist/vue/ds-banner.d.ts +3 -0
  113. package/dist/vue/ds-banner.js +20 -0
  114. package/dist/vue/ds-bar-action.d.ts +3 -0
  115. package/dist/vue/ds-bar-action.js +14 -0
  116. package/dist/vue/ds-bar-nav.d.ts +3 -0
  117. package/dist/vue/ds-bar-nav.js +17 -0
  118. package/dist/vue/ds-bar-title.d.ts +3 -0
  119. package/dist/vue/ds-bar-title.js +32 -0
  120. package/dist/vue/ds-bar-workflow.d.ts +3 -0
  121. package/dist/vue/ds-bar-workflow.js +24 -0
  122. package/dist/vue/ds-breadcrumb.d.ts +3 -0
  123. package/dist/vue/ds-breadcrumb.js +12 -0
  124. package/dist/vue/ds-button-filled.d.ts +3 -0
  125. package/dist/vue/ds-button-filled.js +31 -0
  126. package/dist/vue/ds-button-unfilled.d.ts +3 -0
  127. package/dist/vue/ds-button-unfilled.js +36 -0
  128. package/dist/vue/ds-card-chart.d.ts +3 -0
  129. package/dist/vue/ds-card-chart.js +15 -0
  130. package/dist/vue/ds-card-overview.d.ts +3 -0
  131. package/dist/vue/ds-card-overview.js +21 -0
  132. package/dist/vue/ds-card-setting.d.ts +3 -0
  133. package/dist/vue/ds-card-setting.js +16 -0
  134. package/dist/vue/ds-chart-legend.d.ts +3 -0
  135. package/dist/vue/ds-chart-legend.js +19 -0
  136. package/dist/vue/ds-chart.d.ts +3 -0
  137. package/dist/vue/ds-chart.js +17 -0
  138. package/dist/vue/ds-checkbox.d.ts +3 -0
  139. package/dist/vue/ds-checkbox.js +22 -0
  140. package/dist/vue/ds-chip.d.ts +3 -0
  141. package/dist/vue/ds-chip.js +17 -0
  142. package/dist/vue/ds-code-block.d.ts +3 -0
  143. package/dist/vue/ds-code-block.js +10 -0
  144. package/dist/vue/ds-conversation-list-item.d.ts +3 -0
  145. package/dist/vue/ds-conversation-list-item.js +19 -0
  146. package/dist/vue/ds-conversation-list-section.d.ts +3 -0
  147. package/dist/vue/ds-conversation-list-section.js +9 -0
  148. package/dist/vue/ds-conversation-list.d.ts +3 -0
  149. package/dist/vue/ds-conversation-list.js +8 -0
  150. package/dist/vue/ds-divider.d.ts +3 -0
  151. package/dist/vue/ds-divider.js +12 -0
  152. package/dist/vue/ds-empty-state.d.ts +3 -0
  153. package/dist/vue/ds-empty-state.js +10 -0
  154. package/dist/vue/ds-field.d.ts +3 -0
  155. package/dist/vue/ds-field.js +12 -0
  156. package/dist/vue/ds-filter-menu.d.ts +3 -0
  157. package/dist/vue/ds-filter-menu.js +43 -0
  158. package/dist/vue/ds-icon.d.ts +3 -0
  159. package/dist/vue/ds-icon.js +11 -0
  160. package/dist/vue/ds-input.d.ts +3 -0
  161. package/dist/vue/ds-input.js +40 -0
  162. package/dist/vue/ds-loader.d.ts +3 -0
  163. package/dist/vue/ds-loader.js +10 -0
  164. package/dist/vue/ds-markdown.d.ts +3 -0
  165. package/dist/vue/ds-markdown.js +9 -0
  166. package/dist/vue/ds-menu.d.ts +3 -0
  167. package/dist/vue/ds-menu.js +34 -0
  168. package/dist/vue/ds-message-actions.d.ts +3 -0
  169. package/dist/vue/ds-message-actions.js +15 -0
  170. package/dist/vue/ds-message-bubble.d.ts +3 -0
  171. package/dist/vue/ds-message-bubble.js +8 -0
  172. package/dist/vue/ds-message-composer.d.ts +3 -0
  173. package/dist/vue/ds-message-composer.js +21 -0
  174. package/dist/vue/ds-message-scroller.d.ts +3 -0
  175. package/dist/vue/ds-message-scroller.js +14 -0
  176. package/dist/vue/ds-message.d.ts +3 -0
  177. package/dist/vue/ds-message.js +17 -0
  178. package/dist/vue/ds-mobile-bar-nav.d.ts +3 -0
  179. package/dist/vue/ds-mobile-bar-nav.js +25 -0
  180. package/dist/vue/ds-mobile-header.d.ts +3 -0
  181. package/dist/vue/ds-mobile-header.js +23 -0
  182. package/dist/vue/ds-mobile-section-switcher.d.ts +3 -0
  183. package/dist/vue/ds-mobile-section-switcher.js +13 -0
  184. package/dist/vue/ds-mobile-sheet-nav.d.ts +3 -0
  185. package/dist/vue/ds-mobile-sheet-nav.js +26 -0
  186. package/dist/vue/ds-modal.d.ts +3 -0
  187. package/dist/vue/ds-modal.js +18 -0
  188. package/dist/vue/ds-pagination.d.ts +3 -0
  189. package/dist/vue/ds-pagination.js +25 -0
  190. package/dist/vue/ds-panel-nav.d.ts +3 -0
  191. package/dist/vue/ds-panel-nav.js +40 -0
  192. package/dist/vue/ds-panel-sub-nav.d.ts +3 -0
  193. package/dist/vue/ds-panel-sub-nav.js +15 -0
  194. package/dist/vue/ds-panel-tool-header.d.ts +3 -0
  195. package/dist/vue/ds-panel-tool-header.js +24 -0
  196. package/dist/vue/ds-panel-tool-search.d.ts +3 -0
  197. package/dist/vue/ds-panel-tool-search.js +25 -0
  198. package/dist/vue/ds-panel-tools.d.ts +3 -0
  199. package/dist/vue/ds-panel-tools.js +29 -0
  200. package/dist/vue/ds-paper-texture.d.ts +3 -0
  201. package/dist/vue/ds-paper-texture.js +8 -0
  202. package/dist/vue/ds-radio.d.ts +3 -0
  203. package/dist/vue/ds-radio.js +22 -0
  204. package/dist/vue/ds-scroll-overlay.d.ts +3 -0
  205. package/dist/vue/ds-scroll-overlay.js +11 -0
  206. package/dist/vue/ds-select.d.ts +3 -0
  207. package/dist/vue/ds-select.js +57 -0
  208. package/dist/vue/ds-shell-app.d.ts +3 -0
  209. package/dist/vue/ds-shell-app.js +46 -0
  210. package/dist/vue/ds-shell-page.d.ts +3 -0
  211. package/dist/vue/ds-shell-page.js +16 -0
  212. package/dist/vue/ds-shell-tools.d.ts +3 -0
  213. package/dist/vue/ds-shell-tools.js +28 -0
  214. package/dist/vue/ds-skeleton.d.ts +3 -0
  215. package/dist/vue/ds-skeleton.js +15 -0
  216. package/dist/vue/ds-slider.d.ts +3 -0
  217. package/dist/vue/ds-slider.js +40 -0
  218. package/dist/vue/ds-swatch-picker.d.ts +3 -0
  219. package/dist/vue/ds-swatch-picker.js +14 -0
  220. package/dist/vue/ds-switch.d.ts +3 -0
  221. package/dist/vue/ds-switch.js +22 -0
  222. package/dist/vue/ds-tab-group.d.ts +3 -0
  223. package/dist/vue/ds-tab-group.js +17 -0
  224. package/dist/vue/ds-table-saved-views.d.ts +3 -0
  225. package/dist/vue/ds-table-saved-views.js +28 -0
  226. package/dist/vue/ds-table-toolbar.d.ts +3 -0
  227. package/dist/vue/ds-table-toolbar.js +8 -0
  228. package/dist/vue/ds-table.d.ts +3 -0
  229. package/dist/vue/ds-table.js +86 -0
  230. package/dist/vue/ds-tag.d.ts +3 -0
  231. package/dist/vue/ds-tag.js +23 -0
  232. package/dist/vue/ds-text.d.ts +3 -0
  233. package/dist/vue/ds-text.js +20 -0
  234. package/dist/vue/ds-toast.d.ts +3 -0
  235. package/dist/vue/ds-toast.js +21 -0
  236. package/dist/vue/ds-tooltip-chart.d.ts +3 -0
  237. package/dist/vue/ds-tooltip-chart.js +14 -0
  238. package/dist/vue/ds-tooltip.d.ts +3 -0
  239. package/dist/vue/ds-tooltip.js +18 -0
  240. package/dist/vue/ds-typing-indicator.d.ts +3 -0
  241. package/dist/vue/ds-typing-indicator.js +8 -0
  242. package/dist/vue/vue-runtime.d.ts +32 -0
  243. package/dist/vue/vue-runtime.js +218 -0
  244. package/package.json +14 -2
  245. package/dist/components/p-DIEx1e0M.js.map +0 -1
  246. package/dist/components/p-iBuPFJL9.js.map +0 -1
@@ -195,6 +195,7 @@
195
195
  "exports": {
196
196
  "customElement": "ds-panel-sub-nav",
197
197
  "react": "DsPanelSubNav",
198
+ "vue": "DsPanelSubNav",
198
199
  "angular": "DsPanelSubNav"
199
200
  },
200
201
  "consumption": {
@@ -208,6 +209,10 @@
208
209
  "import": "import { DsPanelSubNav } from '@ds-mo/ui/react';",
209
210
  "example": "<DsPanelSubNav />"
210
211
  },
212
+ "vue": {
213
+ "import": "import { DsPanelSubNav } from '@ds-mo/ui/vue';",
214
+ "example": "<DsPanelSubNav />"
215
+ },
211
216
  "angular": {
212
217
  "import": "import { DsPanelSubNav } from '@ds-mo/ui/angular/ds-panel-sub-nav';",
213
218
  "example": "<ds-panel-sub-nav></ds-panel-sub-nav>"
@@ -218,7 +223,7 @@
218
223
  "@ds-mo/tokens ^6.5.0",
219
224
  "@ds-mo/icons ^7.0.0"
220
225
  ],
221
- "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
226
+ "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
222
227
  }
223
228
  }
224
229
  },
@@ -292,6 +292,7 @@
292
292
  "exports": {
293
293
  "customElement": "ds-panel-tool-header",
294
294
  "react": "DsPanelToolHeader",
295
+ "vue": "DsPanelToolHeader",
295
296
  "angular": "DsPanelToolHeader"
296
297
  },
297
298
  "consumption": {
@@ -305,6 +306,10 @@
305
306
  "import": "import { DsPanelToolHeader } from '@ds-mo/ui/react';",
306
307
  "example": "<DsPanelToolHeader />"
307
308
  },
309
+ "vue": {
310
+ "import": "import { DsPanelToolHeader } from '@ds-mo/ui/vue';",
311
+ "example": "<DsPanelToolHeader />"
312
+ },
308
313
  "angular": {
309
314
  "import": "import { DsPanelToolHeader } from '@ds-mo/ui/angular/ds-panel-tool-header';",
310
315
  "example": "<ds-panel-tool-header></ds-panel-tool-header>"
@@ -315,7 +320,7 @@
315
320
  "@ds-mo/tokens ^6.5.0",
316
321
  "@ds-mo/icons ^7.0.0"
317
322
  ],
318
- "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
323
+ "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
319
324
  }
320
325
  }
321
326
  },
@@ -335,6 +335,7 @@
335
335
  "exports": {
336
336
  "customElement": "ds-panel-tool-search",
337
337
  "react": "DsPanelToolSearch",
338
+ "vue": "DsPanelToolSearch",
338
339
  "angular": "DsPanelToolSearch"
339
340
  },
340
341
  "consumption": {
@@ -348,6 +349,10 @@
348
349
  "import": "import { DsPanelToolSearch } from '@ds-mo/ui/react';",
349
350
  "example": "<DsPanelToolSearch />"
350
351
  },
352
+ "vue": {
353
+ "import": "import { DsPanelToolSearch } from '@ds-mo/ui/vue';",
354
+ "example": "<DsPanelToolSearch />"
355
+ },
351
356
  "angular": {
352
357
  "import": "import { DsPanelToolSearch } from '@ds-mo/ui/angular/ds-panel-tool-search';",
353
358
  "example": "<ds-panel-tool-search></ds-panel-tool-search>"
@@ -357,7 +362,7 @@
357
362
  "@ds-mo/tokens ^6.5.0",
358
363
  "@ds-mo/icons ^7.0.0"
359
364
  ],
360
- "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
365
+ "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
361
366
  }
362
367
  }
363
368
  },
@@ -419,6 +419,7 @@
419
419
  "exports": {
420
420
  "customElement": "ds-panel-tools",
421
421
  "react": "DsPanelTools",
422
+ "vue": "DsPanelTools",
422
423
  "angular": "DsPanelTools"
423
424
  },
424
425
  "consumption": {
@@ -432,6 +433,10 @@
432
433
  "import": "import { DsPanelTools } from '@ds-mo/ui/react';",
433
434
  "example": "<DsPanelTools />"
434
435
  },
436
+ "vue": {
437
+ "import": "import { DsPanelTools } from '@ds-mo/ui/vue';",
438
+ "example": "<DsPanelTools />"
439
+ },
435
440
  "angular": {
436
441
  "import": "import { DsPanelTools } from '@ds-mo/ui/angular/ds-panel-tools';",
437
442
  "example": "<ds-panel-tools></ds-panel-tools>"
@@ -442,7 +447,7 @@
442
447
  "@ds-mo/tokens ^6.5.0",
443
448
  "@ds-mo/icons ^7.0.0"
444
449
  ],
445
- "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
450
+ "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
446
451
  }
447
452
  }
448
453
  },
@@ -89,6 +89,7 @@
89
89
  "exports": {
90
90
  "customElement": "ds-paper-texture",
91
91
  "react": "DsPaperTexture",
92
+ "vue": "DsPaperTexture",
92
93
  "angular": "DsPaperTexture"
93
94
  },
94
95
  "consumption": {
@@ -102,6 +103,10 @@
102
103
  "import": "import { DsPaperTexture } from '@ds-mo/ui/react';",
103
104
  "example": "<DsPaperTexture />"
104
105
  },
106
+ "vue": {
107
+ "import": "import { DsPaperTexture } from '@ds-mo/ui/vue';",
108
+ "example": "<DsPaperTexture />"
109
+ },
105
110
  "angular": {
106
111
  "import": "import { DsPaperTexture } from '@ds-mo/ui/angular/ds-paper-texture';",
107
112
  "example": "<ds-paper-texture></ds-paper-texture>"
@@ -112,7 +117,7 @@
112
117
  "@ds-mo/tokens ^6.5.0",
113
118
  "@ds-mo/icons ^7.0.0"
114
119
  ],
115
- "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
120
+ "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
116
121
  }
117
122
  }
118
123
  },
@@ -129,7 +134,7 @@
129
134
  },
130
135
  {
131
136
  "path": "src/wc/components/PaperTexture/PaperTexture.tsx",
132
- "content": "import { Component, Element, Host, Prop, Watch, h } from '@stencil/core';\nimport {\n emptyPixel,\n getShaderColorFromString,\n getShaderNoiseTexture,\n paperTextureFragmentShader,\n ShaderFitOptions,\n ShaderMount,\n type ShaderMountUniforms,\n} from '@paper-design/shaders';\nimport { DEFAULT_PAPER_TEXTURE_CONFIG, type PaperTextureConfig } from './paper-texture-types';\n\nlet emptyPixelPromise: Promise<HTMLImageElement> | undefined;\nlet noiseTexturePromise: Promise<HTMLImageElement> | undefined;\n\nfunction waitForImage(image: HTMLImageElement): Promise<HTMLImageElement> {\n if (image.complete && image.naturalWidth > 0) return Promise.resolve(image);\n\n return new Promise((resolve, reject) => {\n const onLoad = () => {\n cleanup();\n resolve(image);\n };\n const onError = () => {\n cleanup();\n reject(new Error(`Paper texture image failed to load: ${image.src}`));\n };\n const cleanup = () => {\n image.removeEventListener('load', onLoad);\n image.removeEventListener('error', onError);\n };\n\n image.addEventListener('load', onLoad, { once: true });\n image.addEventListener('error', onError, { once: true });\n });\n}\n\nfunction loadImage(source: HTMLImageElement | string | undefined): Promise<HTMLImageElement> {\n if (source instanceof HTMLImageElement) return waitForImage(source);\n\n const image = new Image();\n if (source && source !== emptyPixel) image.crossOrigin = 'anonymous';\n image.src = source || emptyPixel;\n return waitForImage(image);\n}\n\nfunction loadEmptyPixel(): Promise<HTMLImageElement> {\n emptyPixelPromise ??= loadImage(emptyPixel);\n return emptyPixelPromise;\n}\n\nfunction loadNoiseTexture(): Promise<HTMLImageElement> {\n noiseTexturePromise ??= Promise.resolve(getShaderNoiseTexture()).then(image => {\n if (!image) throw new Error('Paper texture noise texture is unavailable');\n return waitForImage(image);\n });\n return noiseTexturePromise;\n}\n\n@Component({\n tag: 'ds-paper-texture',\n styleUrl: 'PaperTexture.css',\n scoped: true,\n})\nexport class PaperTexture {\n @Element() el!: HTMLElement;\n\n /** Paper Design shader parameters. Set as a JavaScript property. */\n @Prop() config: PaperTextureConfig = {};\n\n private shaderMount?: ShaderMount;\n private syncGeneration = 0;\n private hasLoaded = false;\n\n componentDidLoad() {\n this.hasLoaded = true;\n void this.syncShader();\n }\n\n disconnectedCallback() {\n this.syncGeneration += 1;\n this.disposeShader();\n }\n\n @Watch('config')\n onConfigChange() {\n if (this.hasLoaded) void this.syncShader();\n }\n\n private resolvedConfig(): Required<Omit<PaperTextureConfig, 'image'>> &\n Pick<PaperTextureConfig, 'image'> {\n return {\n ...DEFAULT_PAPER_TEXTURE_CONFIG,\n ...(this.config ?? {}),\n };\n }\n\n private async syncShader() {\n const generation = ++this.syncGeneration;\n const config = this.resolvedConfig();\n\n try {\n const [image, noiseTexture] = await Promise.all([\n loadImage(config.image).catch(() => loadEmptyPixel()),\n loadNoiseTexture(),\n ]);\n\n if (generation !== this.syncGeneration || !this.el.isConnected) return;\n\n const uniforms = this.buildUniforms(config, image, noiseTexture);\n const mountElement = this.el.querySelector<HTMLElement>('.paper-texture__mount');\n if (!mountElement) return;\n\n if (!this.shaderMount) {\n this.shaderMount = new ShaderMount(\n mountElement,\n paperTextureFragmentShader,\n uniforms,\n undefined,\n config.speed,\n config.frame,\n config.minPixelRatio,\n config.maxPixelCount,\n ['u_image']\n );\n } else {\n this.shaderMount.setUniforms(uniforms);\n this.shaderMount.setSpeed(config.speed);\n this.shaderMount.setFrame(config.frame);\n this.shaderMount.setMinPixelRatio(config.minPixelRatio);\n this.shaderMount.setMaxPixelCount(config.maxPixelCount);\n }\n\n this.el.removeAttribute('data-paper-texture-error');\n } catch (error) {\n if (generation !== this.syncGeneration) return;\n this.disposeShader();\n this.el.querySelector<HTMLElement>('.paper-texture__mount')?.replaceChildren();\n this.el.setAttribute('data-paper-texture-error', 'unavailable');\n console.warn('[ds-paper-texture] WebGL2 paper texture unavailable.', error);\n }\n }\n\n private buildUniforms(\n config: Required<Omit<PaperTextureConfig, 'image'>> & Pick<PaperTextureConfig, 'image'>,\n image: HTMLImageElement,\n noiseTexture: HTMLImageElement\n ): ShaderMountUniforms {\n return {\n u_image: image,\n u_noiseTexture: noiseTexture,\n u_colorFront: getShaderColorFromString(config.colorFront),\n u_colorBack: getShaderColorFromString(config.colorBack),\n u_contrast: config.contrast,\n u_roughness: config.roughness,\n u_fiber: config.fiber,\n u_fiberSize: config.fiberSize,\n u_crumples: config.crumples,\n u_crumpleSize: config.crumpleSize,\n u_foldCount: config.foldCount,\n u_folds: config.folds,\n u_fade: config.fade,\n u_drops: config.drops,\n u_seed: config.seed,\n u_fit: ShaderFitOptions[config.fit],\n u_scale: config.scale,\n u_rotation: config.rotation,\n u_offsetX: config.offsetX,\n u_offsetY: config.offsetY,\n u_originX: config.originX,\n u_originY: config.originY,\n u_worldWidth: config.worldWidth,\n u_worldHeight: config.worldHeight,\n };\n }\n\n private disposeShader() {\n this.shaderMount?.dispose();\n this.shaderMount = undefined;\n }\n\n render() {\n const config = this.resolvedConfig();\n return (\n <Host aria-hidden=\"true\" style={{ '--ds-paper-texture-opacity': String(config.opacity) }}>\n <div class=\"paper-texture__mount\" />\n </Host>\n );\n }\n}\n",
137
+ "content": "import { Component, Element, Host, Prop, Watch, h } from '@stencil/core';\nimport {\n emptyPixel,\n getShaderColorFromString,\n getShaderNoiseTexture,\n paperTextureFragmentShader,\n ShaderFitOptions,\n ShaderMount,\n type ShaderMountUniforms,\n} from '@paper-design/shaders';\nimport { DEFAULT_PAPER_TEXTURE_CONFIG, type PaperTextureConfig } from './paper-texture-types';\n\nlet emptyPixelPromise: Promise<HTMLImageElement> | undefined;\nlet noiseTexturePromise: Promise<HTMLImageElement> | undefined;\n\nfunction waitForImage(image: HTMLImageElement): Promise<HTMLImageElement> {\n if (image.complete) {\n return image.naturalWidth > 0\n ? Promise.resolve(image)\n : Promise.reject(new Error(`Paper texture image failed to load: ${image.src}`));\n }\n\n return new Promise((resolve, reject) => {\n const onLoad = () => {\n cleanup();\n resolve(image);\n };\n const onError = () => {\n cleanup();\n reject(new Error(`Paper texture image failed to load: ${image.src}`));\n };\n const cleanup = () => {\n image.removeEventListener('load', onLoad);\n image.removeEventListener('error', onError);\n };\n\n image.addEventListener('load', onLoad, { once: true });\n image.addEventListener('error', onError, { once: true });\n });\n}\n\nfunction loadImage(source: HTMLImageElement | string | undefined): Promise<HTMLImageElement> {\n if (source instanceof HTMLImageElement) return waitForImage(source);\n\n const image = new Image();\n if (source && source !== emptyPixel) image.crossOrigin = 'anonymous';\n image.src = source || emptyPixel;\n return waitForImage(image);\n}\n\nfunction loadEmptyPixel(): Promise<HTMLImageElement> {\n emptyPixelPromise ??= loadImage(emptyPixel);\n return emptyPixelPromise;\n}\n\nfunction loadNoiseTexture(): Promise<HTMLImageElement> {\n noiseTexturePromise ??= Promise.resolve(getShaderNoiseTexture()).then(image => {\n if (!image) throw new Error('Paper texture noise texture is unavailable');\n return waitForImage(image);\n });\n return noiseTexturePromise;\n}\n\n@Component({\n tag: 'ds-paper-texture',\n styleUrl: 'PaperTexture.css',\n scoped: true,\n})\nexport class PaperTexture {\n @Element() el!: HTMLElement;\n\n /** Paper Design shader parameters. Set as a JavaScript property. */\n @Prop() config: PaperTextureConfig = {};\n\n private shaderMount?: ShaderMount;\n private syncGeneration = 0;\n private hasLoaded = false;\n\n componentDidLoad() {\n this.hasLoaded = true;\n void this.syncShader();\n }\n\n connectedCallback() {\n if (this.hasLoaded) void this.syncShader();\n }\n\n disconnectedCallback() {\n this.syncGeneration += 1;\n this.disposeShader();\n }\n\n @Watch('config')\n onConfigChange() {\n if (this.hasLoaded) void this.syncShader();\n }\n\n private resolvedConfig(): Required<Omit<PaperTextureConfig, 'image'>> &\n Pick<PaperTextureConfig, 'image'> {\n return {\n ...DEFAULT_PAPER_TEXTURE_CONFIG,\n ...(this.config ?? {}),\n };\n }\n\n private async syncShader() {\n const generation = ++this.syncGeneration;\n const config = this.resolvedConfig();\n\n try {\n const [image, noiseTexture] = await Promise.all([\n loadImage(config.image).catch(() => loadEmptyPixel()),\n loadNoiseTexture(),\n ]);\n\n if (generation !== this.syncGeneration || !this.el.isConnected) return;\n\n const uniforms = this.buildUniforms(config, image, noiseTexture);\n const mountElement = this.el.querySelector<HTMLElement>('.paper-texture__mount');\n if (!mountElement) return;\n\n if (!this.shaderMount) {\n this.shaderMount = new ShaderMount(\n mountElement,\n paperTextureFragmentShader,\n uniforms,\n undefined,\n config.speed,\n config.frame,\n config.minPixelRatio,\n config.maxPixelCount,\n ['u_image']\n );\n } else {\n this.shaderMount.setUniforms(uniforms);\n this.shaderMount.setSpeed(config.speed);\n this.shaderMount.setFrame(config.frame);\n this.shaderMount.setMinPixelRatio(config.minPixelRatio);\n this.shaderMount.setMaxPixelCount(config.maxPixelCount);\n }\n\n this.el.removeAttribute('data-paper-texture-error');\n } catch (error) {\n if (generation !== this.syncGeneration) return;\n this.disposeShader();\n this.el.querySelector<HTMLElement>('.paper-texture__mount')?.replaceChildren();\n this.el.setAttribute('data-paper-texture-error', 'unavailable');\n console.warn('[ds-paper-texture] WebGL2 paper texture unavailable.', error);\n }\n }\n\n private buildUniforms(\n config: Required<Omit<PaperTextureConfig, 'image'>> & Pick<PaperTextureConfig, 'image'>,\n image: HTMLImageElement,\n noiseTexture: HTMLImageElement\n ): ShaderMountUniforms {\n return {\n u_image: image,\n u_noiseTexture: noiseTexture,\n u_colorFront: getShaderColorFromString(config.colorFront),\n u_colorBack: getShaderColorFromString(config.colorBack),\n u_contrast: config.contrast,\n u_roughness: config.roughness,\n u_fiber: config.fiber,\n u_fiberSize: config.fiberSize,\n u_crumples: config.crumples,\n u_crumpleSize: config.crumpleSize,\n u_foldCount: config.foldCount,\n u_folds: config.folds,\n u_fade: config.fade,\n u_drops: config.drops,\n u_seed: config.seed,\n u_fit: ShaderFitOptions[config.fit],\n u_scale: config.scale,\n u_rotation: config.rotation,\n u_offsetX: config.offsetX,\n u_offsetY: config.offsetY,\n u_originX: config.originX,\n u_originY: config.originY,\n u_worldWidth: config.worldWidth,\n u_worldHeight: config.worldHeight,\n };\n }\n\n private disposeShader() {\n this.shaderMount?.dispose();\n this.shaderMount = undefined;\n }\n\n render() {\n const config = this.resolvedConfig();\n return (\n <Host aria-hidden=\"true\" style={{ '--ds-paper-texture-opacity': String(config.opacity) }}>\n <div class=\"paper-texture__mount\" />\n </Host>\n );\n }\n}\n",
133
138
  "type": "registry:ui"
134
139
  },
135
140
  {
@@ -70,6 +70,9 @@
70
70
  "react": [
71
71
  "Use DsRadio, pass options as an array, and handle onDsChange; value is mutable and updates after user selection."
72
72
  ],
73
+ "vue": [
74
+ "Use DsRadio with v-model for the selected value, bind options as a property, and listen for dsChange."
75
+ ],
73
76
  "angular": [
74
77
  "Use DsRadio with options and value bindings plus dsChange, or import the generated radio value accessor with the component adapter."
75
78
  ]
@@ -338,6 +341,7 @@
338
341
  "exports": {
339
342
  "customElement": "ds-radio",
340
343
  "react": "DsRadio",
344
+ "vue": "DsRadio",
341
345
  "angular": "DsRadio"
342
346
  },
343
347
  "consumption": {
@@ -351,6 +355,10 @@
351
355
  "import": "import { DsRadio } from '@ds-mo/ui/react';",
352
356
  "example": "<DsRadio />"
353
357
  },
358
+ "vue": {
359
+ "import": "import { DsRadio } from '@ds-mo/ui/vue';",
360
+ "example": "<DsRadio />"
361
+ },
354
362
  "angular": {
355
363
  "import": "import { DsRadio } from '@ds-mo/ui/angular/ds-radio';",
356
364
  "example": "<ds-radio></ds-radio>"
@@ -361,7 +369,7 @@
361
369
  "@ds-mo/tokens ^6.5.0",
362
370
  "@ds-mo/icons ^7.0.0"
363
371
  ],
364
- "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
372
+ "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
365
373
  }
366
374
  }
367
375
  },