@skdx/docs-kit 0.35.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 (505) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -0
  3. package/dist/component-aliases.json +12 -0
  4. package/dist/data/THIRD-PARTY-NOTICES.md +21 -0
  5. package/dist/data/angular-inputs.json +1 -0
  6. package/dist/data/api-manifest.json +1 -0
  7. package/dist/data/exports-by-framework.json +1 -0
  8. package/dist/data/honoured-slots.json +1 -0
  9. package/dist/data/styling-hooks-manifest.json +10331 -0
  10. package/dist/frameworks.mjs +64 -0
  11. package/dist/shared/contracts/accordion.d.ts +3 -0
  12. package/dist/shared/contracts/accordion.js +1 -0
  13. package/dist/shared/contracts/alert.d.ts +3 -0
  14. package/dist/shared/contracts/alert.js +1 -0
  15. package/dist/shared/contracts/angle-slider.d.ts +3 -0
  16. package/dist/shared/contracts/angle-slider.js +1 -0
  17. package/dist/shared/contracts/aspect-ratio.d.ts +3 -0
  18. package/dist/shared/contracts/aspect-ratio.js +1 -0
  19. package/dist/shared/contracts/autocomplete.d.ts +3 -0
  20. package/dist/shared/contracts/autocomplete.js +1 -0
  21. package/dist/shared/contracts/avatar.d.ts +3 -0
  22. package/dist/shared/contracts/avatar.js +1 -0
  23. package/dist/shared/contracts/badge.d.ts +3 -0
  24. package/dist/shared/contracts/badge.js +1 -0
  25. package/dist/shared/contracts/box.d.ts +3 -0
  26. package/dist/shared/contracts/box.js +1 -0
  27. package/dist/shared/contracts/breadcrumb.d.ts +3 -0
  28. package/dist/shared/contracts/breadcrumb.js +1 -0
  29. package/dist/shared/contracts/button.d.ts +3 -0
  30. package/dist/shared/contracts/button.js +1 -0
  31. package/dist/shared/contracts/calendar.d.ts +5 -0
  32. package/dist/shared/contracts/calendar.js +1 -0
  33. package/dist/shared/contracts/card.d.ts +3 -0
  34. package/dist/shared/contracts/card.js +1 -0
  35. package/dist/shared/contracts/carousel.d.ts +3 -0
  36. package/dist/shared/contracts/carousel.js +1 -0
  37. package/dist/shared/contracts/change-reason.d.ts +29 -0
  38. package/dist/shared/contracts/change-reason.js +1 -0
  39. package/dist/shared/contracts/chat-composer.d.ts +3 -0
  40. package/dist/shared/contracts/chat-composer.js +1 -0
  41. package/dist/shared/contracts/chat-message.d.ts +3 -0
  42. package/dist/shared/contracts/chat-message.js +1 -0
  43. package/dist/shared/contracts/checkbox-card.d.ts +3 -0
  44. package/dist/shared/contracts/checkbox-card.js +1 -0
  45. package/dist/shared/contracts/checkbox-group.d.ts +3 -0
  46. package/dist/shared/contracts/checkbox-group.js +1 -0
  47. package/dist/shared/contracts/checkbox.d.ts +3 -0
  48. package/dist/shared/contracts/checkbox.js +1 -0
  49. package/dist/shared/contracts/clipboard.d.ts +3 -0
  50. package/dist/shared/contracts/clipboard.js +1 -0
  51. package/dist/shared/contracts/collapsible.d.ts +3 -0
  52. package/dist/shared/contracts/collapsible.js +1 -0
  53. package/dist/shared/contracts/color-picker.d.ts +3 -0
  54. package/dist/shared/contracts/color-picker.js +1 -0
  55. package/dist/shared/contracts/combobox.d.ts +3 -0
  56. package/dist/shared/contracts/combobox.js +1 -0
  57. package/dist/shared/contracts/command.d.ts +3 -0
  58. package/dist/shared/contracts/command.js +1 -0
  59. package/dist/shared/contracts/comment-thread.d.ts +3 -0
  60. package/dist/shared/contracts/comment-thread.js +1 -0
  61. package/dist/shared/contracts/comment.d.ts +3 -0
  62. package/dist/shared/contracts/comment.js +1 -0
  63. package/dist/shared/contracts/confirm-dialog.d.ts +3 -0
  64. package/dist/shared/contracts/confirm-dialog.js +1 -0
  65. package/dist/shared/contracts/conversation-list.d.ts +3 -0
  66. package/dist/shared/contracts/conversation-list.js +1 -0
  67. package/dist/shared/contracts/dashboard-layout.d.ts +3 -0
  68. package/dist/shared/contracts/dashboard-layout.js +1 -0
  69. package/dist/shared/contracts/date-field.d.ts +3 -0
  70. package/dist/shared/contracts/date-field.js +1 -0
  71. package/dist/shared/contracts/date-picker.d.ts +3 -0
  72. package/dist/shared/contracts/date-picker.js +1 -0
  73. package/dist/shared/contracts/date-value.d.ts +11 -0
  74. package/dist/shared/contracts/date-value.js +1 -0
  75. package/dist/shared/contracts/dialog.d.ts +3 -0
  76. package/dist/shared/contracts/dialog.js +1 -0
  77. package/dist/shared/contracts/divider.d.ts +5 -0
  78. package/dist/shared/contracts/divider.js +1 -0
  79. package/dist/shared/contracts/drawer.d.ts +3 -0
  80. package/dist/shared/contracts/drawer.js +1 -0
  81. package/dist/shared/contracts/editable.d.ts +3 -0
  82. package/dist/shared/contracts/editable.js +1 -0
  83. package/dist/shared/contracts/empty-state.d.ts +3 -0
  84. package/dist/shared/contracts/empty-state.js +1 -0
  85. package/dist/shared/contracts/field.d.ts +3 -0
  86. package/dist/shared/contracts/field.js +1 -0
  87. package/dist/shared/contracts/file-upload.d.ts +3 -0
  88. package/dist/shared/contracts/file-upload.js +1 -0
  89. package/dist/shared/contracts/filter-bar.d.ts +3 -0
  90. package/dist/shared/contracts/filter-bar.js +1 -0
  91. package/dist/shared/contracts/floating-panel.d.ts +3 -0
  92. package/dist/shared/contracts/floating-panel.js +1 -0
  93. package/dist/shared/contracts/forgot-password-page.d.ts +3 -0
  94. package/dist/shared/contracts/forgot-password-page.js +1 -0
  95. package/dist/shared/contracts/form-property.d.ts +3 -0
  96. package/dist/shared/contracts/form-property.js +1 -0
  97. package/dist/shared/contracts/form-section.d.ts +3 -0
  98. package/dist/shared/contracts/form-section.js +1 -0
  99. package/dist/shared/contracts/form-validity.d.ts +7 -0
  100. package/dist/shared/contracts/form-validity.js +1 -0
  101. package/dist/shared/contracts/form.d.ts +3 -0
  102. package/dist/shared/contracts/form.js +1 -0
  103. package/dist/shared/contracts/heading.d.ts +3 -0
  104. package/dist/shared/contracts/heading.js +1 -0
  105. package/dist/shared/contracts/image.d.ts +3 -0
  106. package/dist/shared/contracts/image.js +1 -0
  107. package/dist/shared/contracts/index.d.ts +8 -0
  108. package/dist/shared/contracts/index.js +1 -0
  109. package/dist/shared/contracts/kbd.d.ts +3 -0
  110. package/dist/shared/contracts/kbd.js +1 -0
  111. package/dist/shared/contracts/label.d.ts +3 -0
  112. package/dist/shared/contracts/label.js +1 -0
  113. package/dist/shared/contracts/link.d.ts +3 -0
  114. package/dist/shared/contracts/link.js +1 -0
  115. package/dist/shared/contracts/list.d.ts +3 -0
  116. package/dist/shared/contracts/list.js +1 -0
  117. package/dist/shared/contracts/listbox.d.ts +3 -0
  118. package/dist/shared/contracts/listbox.js +1 -0
  119. package/dist/shared/contracts/loading-overlay.d.ts +3 -0
  120. package/dist/shared/contracts/loading-overlay.js +1 -0
  121. package/dist/shared/contracts/member-id.d.ts +18 -0
  122. package/dist/shared/contracts/member-id.js +1 -0
  123. package/dist/shared/contracts/mentions.d.ts +3 -0
  124. package/dist/shared/contracts/mentions.js +1 -0
  125. package/dist/shared/contracts/menu.d.ts +3 -0
  126. package/dist/shared/contracts/menu.js +1 -0
  127. package/dist/shared/contracts/menubar.d.ts +3 -0
  128. package/dist/shared/contracts/menubar.js +1 -0
  129. package/dist/shared/contracts/navigation-menu.d.ts +6 -0
  130. package/dist/shared/contracts/navigation-menu.js +1 -0
  131. package/dist/shared/contracts/notification-center.d.ts +3 -0
  132. package/dist/shared/contracts/notification-center.js +1 -0
  133. package/dist/shared/contracts/number-field.d.ts +5 -0
  134. package/dist/shared/contracts/number-field.js +1 -0
  135. package/dist/shared/contracts/onboarding-checklist.d.ts +3 -0
  136. package/dist/shared/contracts/onboarding-checklist.js +1 -0
  137. package/dist/shared/contracts/overlay-parts.d.ts +73 -0
  138. package/dist/shared/contracts/overlay-parts.js +1 -0
  139. package/dist/shared/contracts/page-container.d.ts +3 -0
  140. package/dist/shared/contracts/page-container.js +1 -0
  141. package/dist/shared/contracts/pagination.d.ts +5 -0
  142. package/dist/shared/contracts/pagination.js +1 -0
  143. package/dist/shared/contracts/password-input.d.ts +6 -0
  144. package/dist/shared/contracts/password-input.js +1 -0
  145. package/dist/shared/contracts/pin-input.d.ts +6 -0
  146. package/dist/shared/contracts/pin-input.js +1 -0
  147. package/dist/shared/contracts/polymorphic.d.ts +6 -0
  148. package/dist/shared/contracts/polymorphic.js +1 -0
  149. package/dist/shared/contracts/popover.d.ts +7 -0
  150. package/dist/shared/contracts/popover.js +1 -0
  151. package/dist/shared/contracts/progress.d.ts +6 -0
  152. package/dist/shared/contracts/progress.js +1 -0
  153. package/dist/shared/contracts/qr-code.d.ts +5 -0
  154. package/dist/shared/contracts/qr-code.js +1 -0
  155. package/dist/shared/contracts/radio-card.d.ts +6 -0
  156. package/dist/shared/contracts/radio-card.js +1 -0
  157. package/dist/shared/contracts/radio-group.d.ts +6 -0
  158. package/dist/shared/contracts/radio-group.js +1 -0
  159. package/dist/shared/contracts/rating.d.ts +6 -0
  160. package/dist/shared/contracts/rating.js +1 -0
  161. package/dist/shared/contracts/reset-password-page.d.ts +3 -0
  162. package/dist/shared/contracts/reset-password-page.js +1 -0
  163. package/dist/shared/contracts/resizable.d.ts +7 -0
  164. package/dist/shared/contracts/resizable.js +1 -0
  165. package/dist/shared/contracts/rules.d.ts +11 -0
  166. package/dist/shared/contracts/rules.js +1 -0
  167. package/dist/shared/contracts/scroll-area.d.ts +6 -0
  168. package/dist/shared/contracts/scroll-area.js +1 -0
  169. package/dist/shared/contracts/select.d.ts +5 -0
  170. package/dist/shared/contracts/select.js +1 -0
  171. package/dist/shared/contracts/selection-value.d.ts +20 -0
  172. package/dist/shared/contracts/selection-value.js +1 -0
  173. package/dist/shared/contracts/sign-in-page.d.ts +3 -0
  174. package/dist/shared/contracts/sign-in-page.js +1 -0
  175. package/dist/shared/contracts/sign-up-page.d.ts +3 -0
  176. package/dist/shared/contracts/sign-up-page.js +1 -0
  177. package/dist/shared/contracts/skeleton.d.ts +5 -0
  178. package/dist/shared/contracts/skeleton.js +1 -0
  179. package/dist/shared/contracts/slider.d.ts +7 -0
  180. package/dist/shared/contracts/slider.js +1 -0
  181. package/dist/shared/contracts/speed-dial.d.ts +6 -0
  182. package/dist/shared/contracts/speed-dial.js +1 -0
  183. package/dist/shared/contracts/spinner.d.ts +6 -0
  184. package/dist/shared/contracts/spinner.js +1 -0
  185. package/dist/shared/contracts/split-button.d.ts +6 -0
  186. package/dist/shared/contracts/split-button.js +1 -0
  187. package/dist/shared/contracts/stat-card.d.ts +3 -0
  188. package/dist/shared/contracts/stat-card.js +1 -0
  189. package/dist/shared/contracts/stepper.d.ts +6 -0
  190. package/dist/shared/contracts/stepper.js +1 -0
  191. package/dist/shared/contracts/styling-hooks.d.ts +8 -0
  192. package/dist/shared/contracts/styling-hooks.js +1 -0
  193. package/dist/shared/contracts/switch.d.ts +6 -0
  194. package/dist/shared/contracts/switch.js +1 -0
  195. package/dist/shared/contracts/table.d.ts +7 -0
  196. package/dist/shared/contracts/table.js +1 -0
  197. package/dist/shared/contracts/tabs.d.ts +5 -0
  198. package/dist/shared/contracts/tabs.js +1 -0
  199. package/dist/shared/contracts/tag-group.d.ts +7 -0
  200. package/dist/shared/contracts/tag-group.js +1 -0
  201. package/dist/shared/contracts/tags-input.d.ts +8 -0
  202. package/dist/shared/contracts/tags-input.js +1 -0
  203. package/dist/shared/contracts/text-field.d.ts +6 -0
  204. package/dist/shared/contracts/text-field.js +1 -0
  205. package/dist/shared/contracts/text.d.ts +6 -0
  206. package/dist/shared/contracts/text.js +1 -0
  207. package/dist/shared/contracts/textarea.d.ts +5 -0
  208. package/dist/shared/contracts/textarea.js +1 -0
  209. package/dist/shared/contracts/time-field.d.ts +5 -0
  210. package/dist/shared/contracts/time-field.js +1 -0
  211. package/dist/shared/contracts/time.d.ts +6 -0
  212. package/dist/shared/contracts/time.js +1 -0
  213. package/dist/shared/contracts/timeline.d.ts +5 -0
  214. package/dist/shared/contracts/timeline.js +1 -0
  215. package/dist/shared/contracts/toast.d.ts +6 -0
  216. package/dist/shared/contracts/toast.js +1 -0
  217. package/dist/shared/contracts/toggle-group.d.ts +6 -0
  218. package/dist/shared/contracts/toggle-group.js +1 -0
  219. package/dist/shared/contracts/toggle.d.ts +5 -0
  220. package/dist/shared/contracts/toggle.js +1 -0
  221. package/dist/shared/contracts/toolbar.d.ts +3 -0
  222. package/dist/shared/contracts/toolbar.js +1 -0
  223. package/dist/shared/contracts/tour.d.ts +5 -0
  224. package/dist/shared/contracts/tour.js +1 -0
  225. package/dist/shared/contracts/transfer.d.ts +6 -0
  226. package/dist/shared/contracts/transfer.js +1 -0
  227. package/dist/shared/contracts/tree-select.d.ts +6 -0
  228. package/dist/shared/contracts/tree-select.js +1 -0
  229. package/dist/shared/contracts/tree.d.ts +6 -0
  230. package/dist/shared/contracts/tree.js +1 -0
  231. package/dist/shared/contracts/types.d.ts +230 -0
  232. package/dist/shared/contracts/types.js +1 -0
  233. package/dist/shared/contracts/usage-card.d.ts +3 -0
  234. package/dist/shared/contracts/usage-card.js +1 -0
  235. package/dist/shared/contracts/user-menu.d.ts +3 -0
  236. package/dist/shared/contracts/user-menu.js +1 -0
  237. package/dist/shared/contracts/verification-page.d.ts +3 -0
  238. package/dist/shared/contracts/verification-page.js +1 -0
  239. package/dist/shared/contracts/workspace-switcher.d.ts +3 -0
  240. package/dist/shared/contracts/workspace-switcher.js +1 -0
  241. package/dist/shared/core/announcer.d.ts +17 -0
  242. package/dist/shared/core/announcer.js +1 -0
  243. package/dist/shared/core/appearance.d.ts +14 -0
  244. package/dist/shared/core/appearance.js +1 -0
  245. package/dist/shared/core/arrow-keys.d.ts +7 -0
  246. package/dist/shared/core/arrow-keys.js +1 -0
  247. package/dist/shared/core/calendar-locale.d.ts +35 -0
  248. package/dist/shared/core/calendar-locale.js +1 -0
  249. package/dist/shared/core/color.d.ts +80 -0
  250. package/dist/shared/core/color.js +1 -0
  251. package/dist/shared/core/controllable.d.ts +42 -0
  252. package/dist/shared/core/controllable.js +1 -0
  253. package/dist/shared/core/csv.d.ts +43 -0
  254. package/dist/shared/core/csv.js +2 -0
  255. package/dist/shared/core/date-segments.d.ts +223 -0
  256. package/dist/shared/core/date-segments.js +1 -0
  257. package/dist/shared/core/date-value.d.ts +57 -0
  258. package/dist/shared/core/date-value.js +1 -0
  259. package/dist/shared/core/dev-mode.d.ts +12 -0
  260. package/dist/shared/core/dev-mode.js +1 -0
  261. package/dist/shared/core/dialogs.d.ts +96 -0
  262. package/dist/shared/core/dialogs.js +1 -0
  263. package/dist/shared/core/dismissal.d.ts +56 -0
  264. package/dist/shared/core/dismissal.js +1 -0
  265. package/dist/shared/core/field-core.d.ts +250 -0
  266. package/dist/shared/core/field-core.js +1 -0
  267. package/dist/shared/core/focus-targets.d.ts +77 -0
  268. package/dist/shared/core/focus-targets.js +1 -0
  269. package/dist/shared/core/format-file-size.d.ts +9 -0
  270. package/dist/shared/core/format-file-size.js +1 -0
  271. package/dist/shared/core/glyph-data.d.ts +13 -0
  272. package/dist/shared/core/glyph-data.js +1 -0
  273. package/dist/shared/core/measure-auto-resize.d.ts +5 -0
  274. package/dist/shared/core/measure-auto-resize.js +1 -0
  275. package/dist/shared/core/media-query.d.ts +7 -0
  276. package/dist/shared/core/media-query.js +1 -0
  277. package/dist/shared/core/mentions.d.ts +116 -0
  278. package/dist/shared/core/mentions.js +2 -0
  279. package/dist/shared/core/pin-chars.d.ts +13 -0
  280. package/dist/shared/core/pin-chars.js +1 -0
  281. package/dist/shared/core/placement.d.ts +102 -0
  282. package/dist/shared/core/placement.js +1 -0
  283. package/dist/shared/core/qr-encoder.d.ts +33 -0
  284. package/dist/shared/core/qr-encoder.js +1 -0
  285. package/dist/shared/core/roving-tab-stop.d.ts +37 -0
  286. package/dist/shared/core/roving-tab-stop.js +1 -0
  287. package/dist/shared/core/select-keyboard.d.ts +80 -0
  288. package/dist/shared/core/select-keyboard.js +1 -0
  289. package/dist/shared/core/selection.d.ts +58 -0
  290. package/dist/shared/core/selection.js +1 -0
  291. package/dist/shared/core/tabbable.d.ts +8 -0
  292. package/dist/shared/core/tabbable.js +1 -0
  293. package/dist/shared/core/timer.d.ts +82 -0
  294. package/dist/shared/core/timer.js +1 -0
  295. package/dist/shared/core/tree-columns.d.ts +48 -0
  296. package/dist/shared/core/tree-columns.js +1 -0
  297. package/dist/shared/core/typeahead.d.ts +27 -0
  298. package/dist/shared/core/typeahead.js +1 -0
  299. package/dist/shared/index.d.ts +113 -0
  300. package/dist/shared/index.js +1 -0
  301. package/dist/skins-src/_foundation-fallback.css +124 -0
  302. package/dist/skins-src/base.css +328 -0
  303. package/dist/skins-src/components/_actuator.css +203 -0
  304. package/dist/skins-src/components/_arrow.css +20 -0
  305. package/dist/skins-src/components/_card-control.css +27 -0
  306. package/dist/skins-src/components/_collection.css +281 -0
  307. package/dist/skins-src/components/_hit-target.css +28 -0
  308. package/dist/skins-src/components/_overlay.css +214 -0
  309. package/dist/skins-src/components/_status.css +38 -0
  310. package/dist/skins-src/components/_trigger.css +85 -0
  311. package/dist/skins-src/components/accordion.css +85 -0
  312. package/dist/skins-src/components/alert.css +118 -0
  313. package/dist/skins-src/components/angle-slider.css +110 -0
  314. package/dist/skins-src/components/aspect-ratio.css +26 -0
  315. package/dist/skins-src/components/autocomplete.css +112 -0
  316. package/dist/skins-src/components/avatar.css +87 -0
  317. package/dist/skins-src/components/badge.css +164 -0
  318. package/dist/skins-src/components/box.css +9 -0
  319. package/dist/skins-src/components/breadcrumb.css +78 -0
  320. package/dist/skins-src/components/button.css +304 -0
  321. package/dist/skins-src/components/calendar.css +269 -0
  322. package/dist/skins-src/components/card.css +116 -0
  323. package/dist/skins-src/components/carousel.css +192 -0
  324. package/dist/skins-src/components/chat-composer.css +89 -0
  325. package/dist/skins-src/components/chat-message.css +98 -0
  326. package/dist/skins-src/components/checkbox-card.css +153 -0
  327. package/dist/skins-src/components/checkbox-group.css +72 -0
  328. package/dist/skins-src/components/checkbox.css +141 -0
  329. package/dist/skins-src/components/clipboard.css +126 -0
  330. package/dist/skins-src/components/collapsible.css +64 -0
  331. package/dist/skins-src/components/color-picker.css +304 -0
  332. package/dist/skins-src/components/combobox.css +111 -0
  333. package/dist/skins-src/components/command.css +73 -0
  334. package/dist/skins-src/components/comment-thread.css +56 -0
  335. package/dist/skins-src/components/comment.css +59 -0
  336. package/dist/skins-src/components/confirm-dialog.css +43 -0
  337. package/dist/skins-src/components/conversation-list.css +142 -0
  338. package/dist/skins-src/components/dashboard-layout.css +106 -0
  339. package/dist/skins-src/components/date-field.css +95 -0
  340. package/dist/skins-src/components/date-picker.css +79 -0
  341. package/dist/skins-src/components/dialog.css +161 -0
  342. package/dist/skins-src/components/divider.css +64 -0
  343. package/dist/skins-src/components/drawer.css +166 -0
  344. package/dist/skins-src/components/editable.css +121 -0
  345. package/dist/skins-src/components/empty-state.css +85 -0
  346. package/dist/skins-src/components/field.css +104 -0
  347. package/dist/skins-src/components/file-upload.css +164 -0
  348. package/dist/skins-src/components/filter-bar.css +48 -0
  349. package/dist/skins-src/components/floating-panel.css +168 -0
  350. package/dist/skins-src/components/forgot-password-page.css +45 -0
  351. package/dist/skins-src/components/form-section.css +75 -0
  352. package/dist/skins-src/components/form.css +115 -0
  353. package/dist/skins-src/components/heading.css +38 -0
  354. package/dist/skins-src/components/image.css +43 -0
  355. package/dist/skins-src/components/kbd.css +76 -0
  356. package/dist/skins-src/components/label.css +45 -0
  357. package/dist/skins-src/components/link.css +72 -0
  358. package/dist/skins-src/components/list.css +104 -0
  359. package/dist/skins-src/components/listbox.css +90 -0
  360. package/dist/skins-src/components/loading-overlay.css +89 -0
  361. package/dist/skins-src/components/mentions.css +79 -0
  362. package/dist/skins-src/components/menu.css +102 -0
  363. package/dist/skins-src/components/menubar.css +130 -0
  364. package/dist/skins-src/components/navigation-menu.css +145 -0
  365. package/dist/skins-src/components/notification-center.css +139 -0
  366. package/dist/skins-src/components/number-field.css +95 -0
  367. package/dist/skins-src/components/onboarding-checklist.css +156 -0
  368. package/dist/skins-src/components/page-container.css +29 -0
  369. package/dist/skins-src/components/pagination.css +147 -0
  370. package/dist/skins-src/components/password-input.css +116 -0
  371. package/dist/skins-src/components/pin-input.css +115 -0
  372. package/dist/skins-src/components/popover.css +108 -0
  373. package/dist/skins-src/components/progress.css +207 -0
  374. package/dist/skins-src/components/qr-code.css +62 -0
  375. package/dist/skins-src/components/radio-card.css +158 -0
  376. package/dist/skins-src/components/radio-group.css +148 -0
  377. package/dist/skins-src/components/rating.css +150 -0
  378. package/dist/skins-src/components/reset-password-page.css +51 -0
  379. package/dist/skins-src/components/resizable.css +131 -0
  380. package/dist/skins-src/components/scroll-area.css +101 -0
  381. package/dist/skins-src/components/select.css +239 -0
  382. package/dist/skins-src/components/sign-in-page.css +47 -0
  383. package/dist/skins-src/components/sign-up-page.css +55 -0
  384. package/dist/skins-src/components/skeleton.css +55 -0
  385. package/dist/skins-src/components/skip-link.css +51 -0
  386. package/dist/skins-src/components/slider.css +164 -0
  387. package/dist/skins-src/components/speed-dial.css +162 -0
  388. package/dist/skins-src/components/spinner.css +59 -0
  389. package/dist/skins-src/components/split-button.css +167 -0
  390. package/dist/skins-src/components/stat-card.css +117 -0
  391. package/dist/skins-src/components/stepper.css +153 -0
  392. package/dist/skins-src/components/switch.css +155 -0
  393. package/dist/skins-src/components/table.css +336 -0
  394. package/dist/skins-src/components/tabs.css +116 -0
  395. package/dist/skins-src/components/tag-group.css +72 -0
  396. package/dist/skins-src/components/tags-input.css +176 -0
  397. package/dist/skins-src/components/text-field.css +182 -0
  398. package/dist/skins-src/components/text.css +83 -0
  399. package/dist/skins-src/components/textarea.css +118 -0
  400. package/dist/skins-src/components/time-field.css +43 -0
  401. package/dist/skins-src/components/time.css +13 -0
  402. package/dist/skins-src/components/timeline.css +206 -0
  403. package/dist/skins-src/components/toast.css +133 -0
  404. package/dist/skins-src/components/toggle-group.css +185 -0
  405. package/dist/skins-src/components/toggle.css +89 -0
  406. package/dist/skins-src/components/toolbar.css +84 -0
  407. package/dist/skins-src/components/tour.css +67 -0
  408. package/dist/skins-src/components/transfer.css +112 -0
  409. package/dist/skins-src/components/tree-select.css +124 -0
  410. package/dist/skins-src/components/tree.css +110 -0
  411. package/dist/skins-src/components/usage-card.css +129 -0
  412. package/dist/skins-src/components/user-menu.css +83 -0
  413. package/dist/skins-src/components/verification-page.css +64 -0
  414. package/dist/skins-src/components/workspace-switcher.css +133 -0
  415. package/dist/skins-src/utilities.css +130 -0
  416. package/dist/skins-src/web-components.css +64 -0
  417. package/dist/strip-paint.d.mts +7 -0
  418. package/dist/strip-paint.mjs +131 -0
  419. package/dist/themes/AntDark.md +14 -0
  420. package/dist/themes/AntDark.ts +47 -0
  421. package/dist/themes/AntLight.md +21 -0
  422. package/dist/themes/AntLight.ts +95 -0
  423. package/dist/themes/CatppuccinLatte.md +20 -0
  424. package/dist/themes/CatppuccinLatte.ts +93 -0
  425. package/dist/themes/CatppuccinMocha.md +15 -0
  426. package/dist/themes/CatppuccinMocha.ts +93 -0
  427. package/dist/themes/ChakraDark.md +8 -0
  428. package/dist/themes/ChakraDark.ts +47 -0
  429. package/dist/themes/ChakraLight.md +14 -0
  430. package/dist/themes/ChakraLight.ts +93 -0
  431. package/dist/themes/Contrast.test.ts +80 -0
  432. package/dist/themes/CupcakeDark.md +8 -0
  433. package/dist/themes/CupcakeDark.ts +39 -0
  434. package/dist/themes/CupcakeLight.md +31 -0
  435. package/dist/themes/CupcakeLight.ts +93 -0
  436. package/dist/themes/DefaultTheme.md +8 -0
  437. package/dist/themes/DefaultTheme.test.ts +96 -0
  438. package/dist/themes/DefaultTheme.ts +137 -0
  439. package/dist/themes/DraculaDark.md +14 -0
  440. package/dist/themes/DraculaDark.ts +93 -0
  441. package/dist/themes/DraculaLight.md +8 -0
  442. package/dist/themes/DraculaLight.ts +55 -0
  443. package/dist/themes/EmeraldDark.md +8 -0
  444. package/dist/themes/EmeraldDark.ts +35 -0
  445. package/dist/themes/EmeraldLight.md +8 -0
  446. package/dist/themes/EmeraldLight.ts +93 -0
  447. package/dist/themes/EverforestDark.md +26 -0
  448. package/dist/themes/EverforestDark.ts +99 -0
  449. package/dist/themes/EverforestLight.md +31 -0
  450. package/dist/themes/EverforestLight.ts +51 -0
  451. package/dist/themes/FluentDark.md +8 -0
  452. package/dist/themes/FluentDark.ts +47 -0
  453. package/dist/themes/FluentLight.md +8 -0
  454. package/dist/themes/FluentLight.ts +100 -0
  455. package/dist/themes/GraphiteDark.md +8 -0
  456. package/dist/themes/GraphiteDark.ts +35 -0
  457. package/dist/themes/GraphiteLight.md +14 -0
  458. package/dist/themes/GraphiteLight.ts +93 -0
  459. package/dist/themes/GruvboxDark.md +14 -0
  460. package/dist/themes/GruvboxDark.ts +93 -0
  461. package/dist/themes/GruvboxLight.md +27 -0
  462. package/dist/themes/GruvboxLight.ts +49 -0
  463. package/dist/themes/MaterialDark.md +8 -0
  464. package/dist/themes/MaterialDark.ts +47 -0
  465. package/dist/themes/MaterialLight.md +8 -0
  466. package/dist/themes/MaterialLight.ts +104 -0
  467. package/dist/themes/MidnightDark.md +8 -0
  468. package/dist/themes/MidnightDark.ts +19 -0
  469. package/dist/themes/MidnightLight.md +8 -0
  470. package/dist/themes/MidnightLight.ts +23 -0
  471. package/dist/themes/NordDark.md +28 -0
  472. package/dist/themes/NordDark.ts +93 -0
  473. package/dist/themes/NordLight.md +20 -0
  474. package/dist/themes/NordLight.ts +50 -0
  475. package/dist/themes/OneDark.md +26 -0
  476. package/dist/themes/OneDark.ts +93 -0
  477. package/dist/themes/OneLight.md +20 -0
  478. package/dist/themes/OneLight.ts +51 -0
  479. package/dist/themes/PrimerDark.md +26 -0
  480. package/dist/themes/PrimerDark.ts +99 -0
  481. package/dist/themes/PrimerLight.md +14 -0
  482. package/dist/themes/PrimerLight.ts +93 -0
  483. package/dist/themes/RosePine.md +23 -0
  484. package/dist/themes/RosePine.ts +93 -0
  485. package/dist/themes/RosePineDawn.md +20 -0
  486. package/dist/themes/RosePineDawn.ts +51 -0
  487. package/dist/themes/SkandaDark.md +8 -0
  488. package/dist/themes/SkandaDark.ts +57 -0
  489. package/dist/themes/SkandaLight.md +8 -0
  490. package/dist/themes/SkandaLight.ts +96 -0
  491. package/dist/themes/SolarizedDark.md +8 -0
  492. package/dist/themes/SolarizedDark.ts +93 -0
  493. package/dist/themes/SolarizedLight.md +32 -0
  494. package/dist/themes/SolarizedLight.ts +93 -0
  495. package/dist/themes/SynthwaveDark.md +8 -0
  496. package/dist/themes/SynthwaveDark.ts +93 -0
  497. package/dist/themes/SynthwaveLight.md +20 -0
  498. package/dist/themes/SynthwaveLight.ts +48 -0
  499. package/dist/themes/Themes.test.ts +110 -0
  500. package/dist/themes/brands.test.ts +63 -0
  501. package/dist/themes/brands.ts +121 -0
  502. package/dist/themes/createBrandTheme.test.ts +223 -0
  503. package/dist/themes/createBrandTheme.ts +298 -0
  504. package/dist/themes/index.ts +54 -0
  505. package/package.json +73 -0
@@ -0,0 +1,230 @@
1
+ /** Component contract mapping for all frameworks. */
2
+ /** One prop a component accepts. */
3
+ export type PropContract = FrameworkScopedContract & {
4
+ name: string;
5
+ type: string;
6
+ defaultValue?: string;
7
+ required: boolean;
8
+ description: string;
9
+ };
10
+ /** One event a component emits. */
11
+ export type EventContract = FrameworkScopedContract & {
12
+ name: string;
13
+ description: string;
14
+ /** The payload as source text; `'void'` where the event carries nothing. */
15
+ detail: string;
16
+ };
17
+ /** One keyboard key and its binding behavior. */
18
+ export interface KeyboardInteraction {
19
+ key: string;
20
+ behavior: string;
21
+ }
22
+ /** Accessibility guarantees for a component. */
23
+ export interface AccessibilityContract {
24
+ role: string;
25
+ keyboard: readonly KeyboardInteraction[];
26
+ ariaAttributes: readonly string[];
27
+ focusManagement: string;
28
+ namingRequirement?: string;
29
+ }
30
+ /** One data attribute a component emits, with the same frameworks/frameworksReason opt-out props get. */
31
+ export type DataAttributeContract = FrameworkScopedContract & {
32
+ name: DataAttr;
33
+ /** Which element carries the attribute and when, for the docs site to render beside the name. */
34
+ description?: string;
35
+ };
36
+ /** Styling hooks: parts, data-attributes, and custom properties. */
37
+ export interface StylingHooksContract {
38
+ cssParts: readonly string[];
39
+ dataAttributes: readonly (DataAttr | DataAttributeContract)[];
40
+ cssCustomProperties: readonly CssVar[];
41
+ partsCaveat?: string;
42
+ stateAttribute?: string;
43
+ }
44
+ /** One skin-level appearance axis: a `data-*` attribute `@skdx/skins` styles, settable as the matching prop or written directly in markup. */
45
+ export interface AppearanceAxisContract {
46
+ attribute: string;
47
+ values: readonly string[];
48
+ stylesheet: string;
49
+ }
50
+ /** One imperative method a component exposes on its element or instance (e.g. `focus`, `open`). */
51
+ export type PublicMethodContract = FrameworkScopedContract & {
52
+ /** Method name. */
53
+ name: string;
54
+ /** Call signature as source text (parameters and return type). */
55
+ signature: string;
56
+ /** Human-readable explanation of what the method does. */
57
+ description: string;
58
+ };
59
+ /**
60
+ * The sanctioned accessor for one context-reached member, per framework;
61
+ * Web Components has no cross-shadow-root context mechanism, so it belongs
62
+ * in {@link ComponentContract.publicMethods} instead.
63
+ */
64
+ export interface ContextApiAccessors {
65
+ react?: string;
66
+ vue?: string;
67
+ svelte?: string;
68
+ angular?: string;
69
+ webComponents?: string;
70
+ }
71
+ /** One of the five framework identifiers the parity tooling names. */
72
+ export type FrameworkKey = keyof ContextApiAccessors;
73
+ /** A `data-*` attribute name as written in markup. */
74
+ export type DataAttr = `data-${string}`;
75
+ /**
76
+ * Every state name a contract may list, spelled exactly as the `data-state`
77
+ * value a skin selector matches. Closed set so a second spelling of an
78
+ * existing state (`readOnly` beside `readonly`) fails to compile.
79
+ */
80
+ export type ComponentState = 'active' | 'assertive' | 'checked' | 'closed' | 'collapsed' | 'complete' | 'completed' | 'copied' | 'current' | 'default' | 'delayed-open' | 'dirty' | 'disabled' | 'dragging' | 'edit' | 'empty' | 'error' | 'expanded' | 'filled' | 'focus' | 'focus-visible' | 'full-screen' | 'half' | 'hidden' | 'highlighted' | 'horizontal' | 'hover' | 'idle' | 'inactive' | 'incomplete' | 'indeterminate' | 'instant-open' | 'invalid' | 'loaded' | 'loading' | 'maximized' | 'minimized' | 'mixed' | 'multiple' | 'off' | 'on' | 'open' | 'optimum' | 'outside-month' | 'over-limit' | 'paused' | 'pending' | 'placeholder' | 'playing' | 'polite' | 'poor' | 'preview' | 'queued' | 'range-end' | 'range-middle' | 'range-start' | 'readonly' | 'required' | 'resizing' | 'selected' | 'static' | 'suboptimal' | 'suspended' | 'today' | 'touched' | 'unavailable' | 'unchecked' | 'unselected' | 'uploading' | 'valid' | 'vertical' | 'visible'
81
+ /** Tour namespaces its states by the part that carries them. */
82
+ | `${'content' | 'next-trigger' | 'prev-trigger'}:${string}`;
83
+ /** A custom property in the `--skdx-` namespace. */
84
+ export type CssVar = `--skdx-${string}`;
85
+ /** Narrows a member to the frameworks that can express it, with a documented architectural reason for the rest; the two fields come together or not at all. */
86
+ /** Copies a scoped member with its framework scope removed. */
87
+ export declare function withoutScope<T extends FrameworkScopedContract>(member: T): Omit<T, 'frameworks' | 'frameworksReason' | 'exception'>;
88
+ /**
89
+ * The kind of capability equivalence a framework-scoped member records — the
90
+ * native channel the frameworks outside its scope reach the same capability
91
+ * through, never a feature they still owe.
92
+ */
93
+ export type ExceptionCategory =
94
+ /** Function-valued prop the other frameworks deliver as a slot, template or projected child. */
95
+ 'render-prop'
96
+ /** Mount switch that only means something where the part actually unmounts. */
97
+ | 'force-mount'
98
+ /** Teleporting the content out of its position in the tree. */
99
+ | 'portal'
100
+ /** Uncontrolled seed the Web Components property already is on its own. */
101
+ | 'wc-default'
102
+ /** Cross-part id and internals wiring the declarative frameworks do while rendering. */
103
+ | 'wc-internals'
104
+ /** Instance method the controlled-props frameworks answer from state instead. */
105
+ | 'imperative'
106
+ /** Data attribute marking a node the custom element generated for itself. */
107
+ | 'wc-marker'
108
+ /** Element polymorphism the other frameworks spell as an attribute directive. */
109
+ | 'as-directive'
110
+ /** Light-DOM rendering the platform forces on form controls and labels. */
111
+ | 'light-dom'
112
+ /** DOM-cased event handler prop that Svelte alone spells lowercase. */
113
+ | 'svelte-dom-event'
114
+ /** Element the other frameworks hand out directly rather than wrap in a method. */
115
+ | 'element-handoff'
116
+ /** Plain HTML attribute the other frameworks take through passthrough. */
117
+ | 'attribute-passthrough'
118
+ /** Event the framework splits, renames or leaves to the platform's own. */
119
+ | 'event-shape'
120
+ /** Presence of content that Svelte cannot detect behind an opaque snippet. */
121
+ | 'snippet-opaque'
122
+ /** Recipe-level switch for a part the other frameworks expose for the consumer to compose by hand. */
123
+ | 'derived-anatomy'
124
+ /** Attribute on an extra host element only one framework renders around the part. */
125
+ | 'framework-host'
126
+ /** Per-part switch the other frameworks set on the root, which reaches the part through context. */
127
+ | 'root-prop';
128
+ export type FrameworkScopedContract = {
129
+ frameworks?: undefined;
130
+ frameworksReason?: undefined;
131
+ exception?: undefined;
132
+ } | {
133
+ /** The frameworks that ship this member; omit for the normal case where every framework ships it. */
134
+ frameworks: readonly FrameworkKey[];
135
+ /** Why the frameworks left out of `frameworks` have no counterpart, in terms of their architecture rather than their backlog. */
136
+ frameworksReason: string;
137
+ /**
138
+ * Which recorded equivalence this narrowing is; the docs render one canonical sentence per category.
139
+ * `| undefined` so a contract can spread a scoped member and re-narrow its `frameworks` under
140
+ * `exactOptionalPropertyTypes`; `contract-props.mjs` is what rejects a narrowing that has none.
141
+ */
142
+ exception?: ExceptionCategory | undefined;
143
+ };
144
+ /** One member reached through context (or DI/factory), not as an element method. */
145
+ export interface ContextApiContract {
146
+ /** Member name — matches its {@link PublicMethodContract.name} when the member is also an element method. */
147
+ name: string;
148
+ /** Call signature as source text (parameters and return type). */
149
+ signature: string;
150
+ /** What the member does, and why context is the access path. */
151
+ description: string;
152
+ /** Default as source text, same spelling rules as PropContract.defaultValue (for readonly members with fixed values). */
153
+ defaultValue?: string;
154
+ /** How to reach it in each framework that exposes it this way. */
155
+ accessors: ContextApiAccessors;
156
+ }
157
+ /** One member one framework ships that adapts an ecosystem the other four do not have, not an undeclared gap. */
158
+ export interface FrameworkExtensionContract {
159
+ /** Which framework ships it; the keys are {@link ContextApiAccessors}'s. */
160
+ framework: keyof ContextApiAccessors;
161
+ /** Part the member lives on, framework-neutral, or omitted for the component root. */
162
+ part?: string;
163
+ /** Member name as that framework spells it. */
164
+ name: string;
165
+ /** TypeScript-style type expression, as source text. */
166
+ type: string;
167
+ /** What it does, which ecosystem it adapts, and why the other four have no counterpart. */
168
+ description: string;
169
+ }
170
+ /** One content slot, with the same frameworks/frameworksReason opt-out props get: a render prop in one framework is a named slot in another. */
171
+ export type SlotContract = FrameworkScopedContract & {
172
+ /** Slot name as consumers spell it; `default` for unnamed projection. */
173
+ name: string;
174
+ /** What belongs in the slot, and what renders when nothing is passed. */
175
+ description: string;
176
+ };
177
+ /** A part name some frameworks spell differently from the contract's, with a documented design reason. */
178
+ export interface PartAliasContract {
179
+ /** The part name those frameworks use instead of the contract's (`Option` for `Item`). */
180
+ name: string;
181
+ /** The frameworks that spell it that way. */
182
+ frameworks: readonly FrameworkKey[];
183
+ /** Why the rename is the design rather than drift, in terms of what the part does there. */
184
+ frameworksReason: string;
185
+ }
186
+ /** One compound part of a component, named framework-neutrally (e.g. `Content`, not `PopoverContent`). */
187
+ export type PartContract = FrameworkScopedContract & {
188
+ /** Framework-neutral part name, PascalCase and without the component prefix (e.g. `Content`, `ClearButton`). */
189
+ name: string;
190
+ /** What the part is for and where it sits relative to the root. */
191
+ description: string;
192
+ /** Set when the Web Components element renders into the light DOM, so its `part=` names are unreachable from `::part()` and skins target it by class instead. */
193
+ lightDom?: true;
194
+ /** Other names this part goes by. See {@link PartAliasContract}. */
195
+ aliases?: readonly PartAliasContract[];
196
+ /** Props this part accepts, in addition to whatever the framework's base element props are. */
197
+ props?: readonly PropContract[];
198
+ /** Events this part emits. Same lowercase-kebab-case rule as {@link EventContract.name}. */
199
+ events?: readonly EventContract[];
200
+ /** Content this part projects (React children, Angular projection, Vue/Svelte/Web Components slots). Root slots stay on ComponentContract.slots. */
201
+ slots?: readonly SlotContract[];
202
+ /** Imperative methods this part publishes on its own element or instance (e.g. Fieldset's `validate()`), separate from root methods. */
203
+ methods?: readonly PublicMethodContract[];
204
+ };
205
+ /** The full shared contract for one component; slots cover each framework's native content projection. */
206
+ export interface ComponentContract {
207
+ name: string;
208
+ purpose: string;
209
+ props: readonly PropContract[];
210
+ events: readonly EventContract[];
211
+ /** The compound parts this component is composed of; absent on single-element components. */
212
+ parts?: readonly PartContract[];
213
+ /** Set when the Web Components root element renders into the light DOM, so its `part=` names are unreachable from `::part()` and skins target it by class instead. */
214
+ lightDom?: true;
215
+ slots: readonly SlotContract[];
216
+ /** Skin-level appearance vocabulary: `data-*` attributes the skin reads; where the contract declares the matching prop, either path renders the same. */
217
+ appearance?: readonly AppearanceAxisContract[];
218
+ /** The `data-state` values this component emits, from the {@link ComponentState} vocabulary. */
219
+ states: readonly ComponentState[];
220
+ controlledUncontrolled: string;
221
+ formBehavior: string;
222
+ validationBehavior: string;
223
+ accessibility: AccessibilityContract;
224
+ styling: StylingHooksContract;
225
+ publicMethods: readonly PublicMethodContract[];
226
+ /** Members reached through context (or DI/factory), absent on most components. */
227
+ contextApi?: readonly ContextApiContract[];
228
+ /** Members one framework ships that adapt its ecosystem, absent on most components. */
229
+ frameworkExtensions?: readonly FrameworkExtensionContract[];
230
+ }
@@ -0,0 +1 @@
1
+ function a(e){let{frameworks:r,frameworksReason:n,exception:o,...t}=e;return t}export{a as withoutScope};
@@ -0,0 +1,3 @@
1
+ import type { ComponentContract } from './types.js';
2
+ /** Contract for the UsageCard block: a quota tile composing Progress and Text. */
3
+ export declare const usageCardContract: ComponentContract;
@@ -0,0 +1 @@
1
+ import{ROOT_DATA_ATTRIBUTES as e}from"./styling-hooks.js";var a={name:"UsageCard",purpose:"A quota / consumption tile block composing Progress and Text. Renders a labelled group holding the amount used against a limit, a derived meter and a status colour, handling a finite, zero, unlimited or unknown limit without division errors. Ships in the blocks package of each framework, not the core package.",props:[{name:"label",type:"string",required:!0,description:"Name of the quota, rendered into the label that names the group through aria-labelledby."},{name:"used",type:"number",required:!0,description:"The current amount consumed, formatted by formatValue for the value region and the meter."},{name:"limit",type:"number | null",required:!1,description:"The finite cap used is measured against; null renders unlimitedLabel instead of a number. No meter or limit text renders when omitted."},{name:"unit",type:"string",required:!1,description:'Unit label rendered after the limit text, such as "GB" or "seats".'},{name:"formatValue",type:"(value: number) => string",defaultValue:"String",required:!1,description:"Formats used and limit for the consumer's own locale and precision, in the value region and the meter's readout."},{name:"unlimitedLabel",type:"string",defaultValue:"'Unlimited'",required:!1,description:"Text rendered in place of a limit number when limit is null."},{name:"description",type:"string",required:!1,description:"Supporting copy rendered below the meter, in the skin's muted tone."},{name:"actions",type:"unknown",required:!1,frameworks:["react","svelte","angular"],exception:"render-prop",frameworksReason:"Vue and Web Components take this as a named slot rather than a prop \u2014 Vue because a renderable region is a slot in Vue's own idiom, Web Components because a custom element attribute carries a string and cannot carry a node. Both slot spellings are declared under `slots`.",description:"Controls rendered at the end of the header, such as a manage-plan link. A prop in React, Svelte, and Angular; Vue and Web Components use the `actions` slot."},{name:"footer",type:"unknown",required:!1,frameworks:["react","svelte","angular"],exception:"render-prop",frameworksReason:"Vue and Web Components take this as a named slot rather than a prop \u2014 Vue because a renderable region is a slot in Vue's own idiom, Web Components because a custom element attribute carries a string and cannot carry a node. Both slot spellings are declared under `slots`.",description:"Content rendered in a footer region below the card, such as renewal or reset metadata. A prop in React, Svelte, and Angular; Vue and Web Components use the `footer` slot."},{name:"status",type:"'info' | 'success' | 'warning' | 'danger' | (string & {})",required:!1,description:"Colour role written to data-status, tinting the meter fill and the used amount. Over-limit is derived, not set through this prop."}],events:[],slots:[{name:"actions",description:"Controls placed at the end of the header."},{name:"footer",description:"Content placed in a footer region below the card."}],appearance:[{attribute:"data-status",values:["info","success","warning","danger"],stylesheet:"usage-card.css"}],states:["default","over-limit"],controlledUncontrolled:"Stateless \u2014 UsageCard holds no internal state.",formBehavior:"Not applicable \u2014 UsageCard participates in no form.",validationBehavior:"Not applicable \u2014 UsageCard renders a reading rather than participating in any validation.",accessibility:{role:'group (native <div role="group"> named by its label; the derived Progress is role="meter" named by the same label)',keyboard:[],ariaAttributes:["aria-labelledby on the group points at the label, so the tile is announced by its quota name","aria-labelledby on the derived meter points at the same label, so the reading and the tile share one name"],focusManagement:"Nothing inside the block is focusable except the controls the consumer supplies through actions and footer."},styling:{cssParts:["usage-card","header","label","actions","value","used","limit","unit","progress","description","footer"],dataAttributes:[...e,"data-state","data-status",{name:"data-skdx-usage-card-generated",frameworks:["webComponents"],exception:"wc-marker",frameworksReason:'Marks a node the element generated for itself rather than one the consumer authored. React, Vue, Svelte and Angular re-render their derived anatomy declaratively, so "mine or theirs" is answered by the framework and no marker is needed.'}],cssCustomProperties:[]},publicMethods:[]};export{a as usageCardContract};
@@ -0,0 +1,3 @@
1
+ import type { ComponentContract } from './types.js';
2
+ /** Contract for the UserMenu block: an avatar-and-identity trigger opening a menu with a repeated identity header. */
3
+ export declare const userMenuContract: ComponentContract;
@@ -0,0 +1 @@
1
+ import{closeAutoFocusEvent as e,dismissalEvents as t,openChangeCompleteEvent as r}from"./overlay-parts.js";import{ROOT_DATA_ATTRIBUTES as n}from"./styling-hooks.js";var i={name:"UserMenu",purpose:"The signed-in user's menu, composing MenuRoot, MenuTrigger, MenuPortal, MenuContent, MenuLabel, MenuSeparator and Avatar. A derived trigger shows the avatar, name and description; the panel repeats the identity in a header above the application's own entries. Ships in the blocks package of each framework, not the core package.",props:[{name:"name",type:"string",required:!0,description:"The signed-in user's name, rendered in the trigger and repeated in the menu header."},{name:"description",type:"string",required:!1,description:"Secondary text such as an email or role, rendered below the name in the trigger and the header. Neither region renders it when omitted."},{name:"avatarSrc",type:"string",required:!1,description:"Source of the identity image, passed straight through to the derived Avatar. The Avatar renders its initials fallback when omitted."},{name:"status",type:"unknown",required:!1,frameworks:["react","svelte","angular"],exception:"render-prop",frameworksReason:"Vue and Web Components take this as a named slot rather than a prop \u2014 Vue because a renderable region is a slot in Vue's own idiom, Web Components because a custom element attribute carries a string and cannot carry a node. Both slot spellings are declared under `slots`.",description:"Extra indicator, such as a status dot or Badge, rendered after the identity in the trigger. No indicator renders when omitted. A prop in React, Svelte, and Angular; Vue and Web Components use the `status` slot."},{name:"trigger",type:"unknown",required:!1,frameworks:["react","svelte","angular"],exception:"render-prop",frameworksReason:"Vue and Web Components take this as a named slot rather than a prop \u2014 Vue because a renderable region is a slot in Vue's own idiom, Web Components because a custom element attribute carries a string and cannot carry a node. Both slot spellings are declared under `slots`.",description:"Element that replaces the derived avatar-and-identity trigger entirely, merged with the menu's open behaviour. The derived trigger renders when omitted. A prop in React, Svelte, and Angular; Vue and Web Components use the `trigger` slot."},{name:"variant",type:"'compact' | (string & {})",required:!1,description:"Visual rung written to data-variant on the derived trigger; 'compact' visually hides the identity text while keeping it as the accessible name."},{name:"open",type:"boolean",required:!1,description:"Whether the menu is open, for controlled usage. Pair with an open-change event."},{name:"defaultOpen",type:"boolean",defaultValue:"false",required:!1,description:"Whether the menu starts open, for uncontrolled usage."},{name:"side",type:"'top' | 'right' | 'bottom' | 'left'",defaultValue:"'bottom'",required:!1,description:"Which side of the trigger the menu panel opens on."},{name:"align",type:"'start' | 'center' | 'end'",defaultValue:"'end'",required:!1,description:"Alignment of the menu panel relative to the side it opens on."}],events:[...t("menu"),e("menu"),r("menu"),{name:"open-change",description:"Fires with the new open state whenever the trigger opens or closes the menu.",detail:"boolean"}],slots:[{name:"default",description:"The application's own menu entries, rendered below the repeated identity header."},{name:"trigger",description:"Content that replaces the derived avatar-and-identity trigger entirely."},{name:"status",description:"An extra indicator rendered after the identity in the trigger."}],appearance:[{attribute:"data-variant",values:["compact"],stylesheet:"user-menu.css"}],states:["default"],controlledUncontrolled:"Open state is controlled when open is set, paired with onOpenChange; otherwise uncontrolled, seeded from defaultOpen.",formBehavior:"Not applicable \u2014 UserMenu participates in no form.",validationBehavior:"Not applicable \u2014 UserMenu carries no value and participates in no validation.",accessibility:{role:'button (the derived trigger is a native <button> with aria-haspopup="menu" and aria-expanded from the core MenuTrigger; the popup is role="menu")',keyboard:[{key:"Enter/Space/ArrowDown",behavior:"Opens the menu, focusing its first item."},{key:"ArrowUp",behavior:"Opens the menu, focusing its last item."},{key:"ArrowDown/ArrowUp",behavior:"Moves focus between entries once the menu is open."},{key:"Escape",behavior:"Closes the menu and returns focus to the trigger."},{key:"A\u2013Z",behavior:"Typeahead: moves focus to the next entry whose text starts with the typed character."}],ariaAttributes:['aria-haspopup="menu" and aria-expanded on the trigger, from the core MenuTrigger','the panel carries role="menu" and aria-labelledby pointing at the trigger, from the core MenuContent'],focusManagement:"Opening the menu moves focus to its first (or, from ArrowUp, last) entry; closing returns focus to the trigger."},styling:{cssParts:["user-menu","avatar","identity","name","description","content","header"],dataAttributes:[...n,"data-variant",{name:"data-skdx-user-menu-generated",frameworks:["webComponents"],exception:"wc-marker",frameworksReason:'Marks a node the element generated for itself rather than one the consumer authored. React, Vue, Svelte and Angular re-render their derived anatomy declaratively, so "mine or theirs" is answered by the framework and no marker is needed.'}],cssCustomProperties:[]},publicMethods:[]};export{i as userMenuContract};
@@ -0,0 +1,3 @@
1
+ import type { ComponentContract } from './types.js';
2
+ /** Contract for the VerificationPage block: a one-time-code pin input with a submit and a consumer-driven resend. */
3
+ export declare const verificationPageContract: ComponentContract;
@@ -0,0 +1 @@
1
+ import{changeDetail as e}from"./change-reason.js";import{ROOT_DATA_ATTRIBUTES as t}from"./styling-hooks.js";var o={name:"VerificationPage",purpose:"A one-time-code block composing Heading, Text, Alert, Form, Field, PinInput and Button. It collects a code of a fixed length, reports it through a verify event once it is complete, and offers a resend control whose cooldown the consumer owns. Ships in the blocks package of each framework, not the core package.",props:[{name:"title",type:"string",defaultValue:"'Enter your verification code'",required:!1,description:"Heading text, rendered into a derived <h1> that names the section."},{name:"description",type:"string",required:!1,description:"Supporting copy rendered into a derived Text below the title, naming where the code was sent. No description region renders when omitted."},{name:"error",type:"string",required:!1,description:"Message rendered into a derived error Alert above the form. The block never clears it: set it from the verify handler and reset it when the next attempt starts."},{name:"pending",type:"boolean",defaultValue:"false",required:!1,description:"Marks the request in flight, making the submit button busy and unusable while the code boxes stay editable, so the user can still correct a digit."},{name:"codeLabel",type:"string",defaultValue:"'Verification code'",required:!1,description:"Field label and accessible name of the derived pin input holding the code, so the group of boxes is announced as one control."},{name:"length",type:"number",defaultValue:"6",required:!1,description:"How many character boxes the code is entered into, and how long a complete code is before it may be submitted."},{name:"value",type:"string",required:!1,description:"Current code, for controlled usage; pair it with the value-change event. Uncontrolled, the pin input tracks the code itself."},{name:"defaultValue",type:"string",required:!1,description:"Initial code, for uncontrolled usage \u2014 seeds the boxes on first render and leaves the rest empty."},{name:"submitLabel",type:"string",defaultValue:"'Verify'",required:!1,description:"Text of the form submit button."},{name:"resendLabel",type:"string",defaultValue:"'Resend code'",required:!1,description:"Text of the resend button, which renders only alongside a resend event handler."},{name:"resendDisabled",type:"boolean",defaultValue:"false",required:!1,description:"Makes the resend button unusable, for a consumer running its own cooldown between requests."},{name:"resendHint",type:"string",required:!1,description:"Note rendered beside the resend button, such as how long the cooldown has left. The block runs no timer of its own."},{name:"footer",type:"unknown",required:!1,frameworks:["react","svelte","angular"],exception:"render-prop",frameworksReason:"Vue and Web Components take this as a named slot rather than a prop \u2014 Vue because a renderable region is a slot in Vue's own idiom, Web Components because a custom element attribute carries a string and cannot carry a node. Both slot spellings are declared under `slots`.",description:"Navigation rendered below the resend region, such as a link back to the sign-in page. No footer region renders when omitted. A prop in React, Svelte, and Angular; Vue and Web Components use the `footer` slot."}],events:[{name:"verify",detail:"{ code: string }",description:"Fires when the form is submitted with a code of exactly the declared length, carrying that code. The native submit is prevented, so the consumer performs the check and sets error on failure."},{name:"resend",detail:"void",description:"Fires when the resend button is activated. Handling it is what renders the resend region at all; the cooldown between requests belongs to the consumer."},{name:"value-change",detail:e("string"),description:"Fires with the new code whenever any box changes, controlled or not, so a consumer can mirror the code or clear a stale error."}],slots:[{name:"default",description:"Extra fields rendered inside the form, above the submit button."},{name:"footer",description:"Navigation below the resend region, such as a link back to the sign-in page."}],states:["default"],controlledUncontrolled:"The code is controllable through value with the value-change event, or seeded with defaultValue and tracked by the pin input; error and pending are always controlled by the consumer.",formBehavior:"The form is a core Form root whose pin input submits the joined code as one required entry with a length pattern, so a short code is refused by constraint validation and emits nothing.",validationBehavior:"The code is required and only satisfies its constraint once every box is filled; the block adds no validators and never times the resend cooldown.",accessibility:{role:"region (native <section> named by its heading through aria-labelledby)",keyboard:[{key:"ArrowLeft/ArrowRight",behavior:"Moves between the code boxes, which the pin input wires itself."},{key:"Enter",behavior:"Submits the form while a code box has focus (native form submission)."}],ariaAttributes:["aria-labelledby on the <section> points at the derived heading","the pin input group carries aria-label from codeLabel, so the boxes are announced as one named control","the derived error Alert is a live region, so a new error is announced without moving focus"],focusManagement:"Focus follows the code boxes as the pin input advances them; a refused submit reports through constraint validation rather than a jump of the block's own."},styling:{cssParts:["verification-page","panel","title","description","error","form","field","code","submit","resend","resend-hint","footer"],dataAttributes:[...t,{name:"data-skdx-verification-page-generated",frameworks:["webComponents"],exception:"wc-marker",frameworksReason:'Marks a node the element generated for itself rather than one the consumer authored. React, Vue, Svelte and Angular re-render their derived anatomy declaratively, so "mine or theirs" is answered by the framework and no marker is needed.'},{name:"data-skdx-verification-page-content",frameworks:["webComponents"],exception:"wc-marker",frameworksReason:'Marks a node the element generated for itself rather than one the consumer authored. React, Vue, Svelte and Angular re-render their derived anatomy declaratively, so "mine or theirs" is answered by the framework and no marker is needed.'}],cssCustomProperties:[]},publicMethods:[]};export{o as verificationPageContract};
@@ -0,0 +1,3 @@
1
+ import type { ComponentContract } from './types.js';
2
+ /** Contract for the WorkspaceSwitcher block: a searchable list that switches the active context. */
3
+ export declare const workspaceSwitcherContract: ComponentContract;
@@ -0,0 +1 @@
1
+ import{changeDetail as e}from"./change-reason.js";import{autoFocusEvents as t,dismissalEvents as a,openChangeCompleteEvent as r}from"./overlay-parts.js";import{ROOT_DATA_ATTRIBUTES as n}from"./styling-hooks.js";var l={name:"WorkspaceSwitcher",purpose:"Switches the active context \u2014 workspace, organisation, team, account or project \u2014 from a searchable list with groups, disabled entries, loading and empty states, and a footer for create or manage actions. Composes the Popover parts (PopoverRoot, PopoverTrigger, PopoverPortal, PopoverContent) around the Command parts (Command, CommandInput, CommandList, CommandEmpty, CommandLoading, CommandGroup, CommandItem); the leading glyph is a consumer-supplied node such as an Avatar. Terminology is the consumer's, and the block performs no routing and no persistence. Ships in the blocks package of each framework, not the core package.",props:[{name:"items",type:"ReadonlyArray<{ id: string; label: string; description?: string; group?: string; disabled?: boolean }>",required:!0,description:"Every context the user may switch to, rendered in the order given; items sharing a group are listed under that heading, ungrouped ones first."},{name:"value",type:"string",required:!1,description:"Id of the active context, for controlled usage; pair it with the value-change event."},{name:"defaultValue",type:"string",defaultValue:"''",required:!1,description:"Id of the context active on first render, for uncontrolled usage; the trigger shows the placeholder until one is picked."},{name:"placeholder",type:"string",defaultValue:"'Select'",required:!1,description:"Trigger text shown while no item in the list is the active one."},{name:"label",type:"string",required:!1,description:"Accessible name for the trigger and the result list, for when the visible trigger text is not enough on its own."},{name:"searchLabel",type:"string",defaultValue:"'Search'",required:!1,description:"Accessible name of the search field inside the open panel."},{name:"searchPlaceholder",type:"string",required:!1,description:"Placeholder text shown inside the empty search field; the field renders none when omitted."},{name:"emptyMessage",type:"string",defaultValue:"'No results'",required:!1,description:"Message shown beside the list when the search matches nothing."},{name:"loadingMessage",type:"string",defaultValue:"'Loading'",required:!1,description:"Message announced through a live region while the results are still in flight."},{name:"loading",type:"boolean",defaultValue:"false",required:!1,description:"Marks the results as in flight, showing the loading message and withholding the empty one."},{name:"selectedLabel",type:"string",defaultValue:"'Current'",required:!1,description:"Visually hidden text appended to the active item, naming it for screen reader users."},{name:"leading",type:"Snippet<[WorkspaceSwitcherItem]>",required:!1,frameworks:["svelte"],exception:"render-prop",frameworksReason:"Svelte spells a per-item render hook as a snippet prop, which is both a prop and a slot in that framework's own idiom; the other frameworks take it through renderLeading or the `leading` scoped slot.",description:"The Svelte snippet form of `renderLeading`, rendered once per item with that item as its argument."},{name:"renderLeading",type:"unknown",required:!1,frameworks:["react","angular","webComponents"],exception:"render-prop",frameworksReason:"Vue takes this as a scoped slot and Svelte as a snippet of the same name rather than a prop, because a per-item render hook is a slot with slot props in their own idioms; React, Angular and Web Components take the function, since one markup slot cannot render once per item.",description:"Renders a decorative glyph, such as an avatar or a logo, for one item and for the trigger. No leading region renders when omitted. A prop in React and Angular; Vue uses the `leading` scoped slot and Svelte the `leading` snippet; Web Components set the function as a property."},{name:"actions",type:"unknown",required:!1,frameworks:["react","svelte","angular"],exception:"render-prop",frameworksReason:"Vue and Web Components take this as a named slot rather than a prop \u2014 Vue because a renderable region is a slot in Vue's own idiom, Web Components because a custom element attribute carries a string and cannot carry a node. Both slot spellings are declared under `slots`.",description:"Controls placed in the panel's footer, such as create and manage buttons. No footer region renders when omitted. A prop in React, Svelte, and Angular; Vue and Web Components use the `actions` slot."},{name:"trigger",type:"unknown",required:!1,frameworks:["react","svelte","angular"],exception:"render-prop",frameworksReason:"Vue and Web Components take this as a named slot rather than a prop \u2014 Vue because a renderable region is a slot in Vue's own idiom, Web Components because a custom element attribute carries a string and cannot carry a node. Both slot spellings are declared under `slots`.",description:"Replaces the derived trigger button with the consumer's own element, which still receives the popover wiring. A prop in React, Svelte, and Angular; Vue and Web Components use the `trigger` slot."},{name:"open",type:"boolean",required:!1,description:"Whether the panel is open, for controlled usage; pair it with the open-change event."},{name:"defaultOpen",type:"boolean",defaultValue:"false",required:!1,description:"Whether the panel is open on first render, for uncontrolled usage."}],events:[...a("panel"),...t("panel"),r("panel"),{name:"value-change",detail:e("string"),description:"Fires with the id of the item the user picked, immediately before the panel closes."},{name:"open-change",detail:"boolean",description:"Fires with the new open state whenever the panel opens or closes, controlled or not."}],slots:[{name:"trigger",description:"The trigger prop's element, replacing the derived trigger button entirely."},{name:"leading",frameworks:["vue","svelte"],exception:"render-prop",frameworksReason:"Vue spells a per-item render hook as a scoped slot and Svelte as a snippet; React, Angular and Web Components take the equivalent function through the prop of the same purpose.",description:"The renderLeading prop's glyph, scoped to the item it decorates and to the trigger."},{name:"actions",description:"The actions prop's content \u2014 the footer's create and manage controls."}],states:["default"],controlledUncontrolled:"Both the active id and the open state are controlled when their prop is set and tracked internally otherwise; each reports every change through its event either way.",formBehavior:"Not applicable \u2014 WorkspaceSwitcher submits nothing and participates in no form.",validationBehavior:"Not applicable \u2014 the active id is always one of the items and carries no validation.",accessibility:{role:'button (derived trigger with aria-haspopup="dialog" and aria-expanded from the core PopoverTrigger; the popup is a non-modal Popover holding a Command listbox with a search input, so Tab and outside interaction leave it without an Escape key)',keyboard:[{key:"ArrowDown/ArrowUp",behavior:"Moves the highlight between the listed items."},{key:"Enter",behavior:"Selects the highlighted item and closes the panel."},{key:"Escape",behavior:"Closes the panel and returns focus to the trigger."},{key:"Character keys",behavior:"Type into the search field to filter the list down to matching items."}],ariaAttributes:['aria-haspopup="dialog" and aria-expanded on the trigger come from the core PopoverTrigger','the panel is a role="dialog" whose search input owns real focus and points aria-activedescendant at the highlighted option',"the result listbox is named by the label prop, falling back to the placeholder","the leading glyph regions are aria-hidden, so the item label alone carries the meaning","the active item ends with visually hidden text naming it as the current context"],focusManagement:"Opening moves focus into the panel and onto the search field, which keeps it while the arrow keys move a virtual highlight; closing returns focus to the trigger."},styling:{cssParts:["workspace-switcher","leading","current","description","content","search","list","loading","empty","group","item","item-leading","item-label","item-description","footer"],dataAttributes:[...n,"data-selected",{name:"data-skdx-workspace-switcher-generated",frameworks:["webComponents"],exception:"wc-marker",frameworksReason:'Marks a node the element generated for itself rather than one the consumer authored. React, Vue, Svelte and Angular re-render their derived anatomy declaratively, so "mine or theirs" is answered by the framework and no marker is needed.'}],cssCustomProperties:[]},publicMethods:[]};export{l as workspaceSwitcherContract};
@@ -0,0 +1,17 @@
1
+ /** Which of the two singleton live regions a message is routed to. */
2
+ export type AnnouncePoliteness = 'polite' | 'assertive';
3
+ /** How long successive announcements keep merging into one write before the region updates. */
4
+ export declare const ANNOUNCE_DEBOUNCE_MS = 150;
5
+ /** Owns the `aria-live` regions and their debounced writes; one instance per process (or per Angular injector). */
6
+ export declare class Announcer {
7
+ private readonly regions;
8
+ /**
9
+ * Schedules `message` for the region; a burst inside one debounce window collapses to its last message, and a repeat of the text already shown is re-announced.
10
+ */
11
+ announce(message: string, politeness?: AnnouncePoliteness): void;
12
+ /** Empties the region(s) and drops anything still pending; pass a politeness to clear just one. */
13
+ clear(politeness?: AnnouncePoliteness): void;
14
+ /** Clears and removes the regions from the document. */
15
+ destroy(): void;
16
+ private regionFor;
17
+ }
@@ -0,0 +1 @@
1
+ var d=150,r="position:absolute;border:0;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;word-wrap:normal;",o=class{constructor(){this.regions=new Map}announce(n,i="polite"){if(typeof document>"u")return;let e=n.trim();if(!e)return;let t=this.regionFor(i);t.pending=e,t.node.textContent="",clearTimeout(t.timer),t.timer=setTimeout(()=>{t.timer=void 0,t.node.textContent=t.pending},150)}clear(n){for(let[i,e]of this.regions)n!==void 0&&i!==n||(clearTimeout(e.timer),e.timer=void 0,e.node.textContent="")}destroy(){this.clear();for(let n of this.regions.values())n.node.remove();this.regions.clear()}regionFor(n){let i=this.regions.get(n);if(i?.node.isConnected)return i;let e=document.createElement("div");e.setAttribute("aria-live",n),e.setAttribute("aria-atomic","true"),e.setAttribute("data-skdx-live-announcer",n),e.style.cssText=r,document.body.appendChild(e);let t={node:e,pending:"",timer:void 0};return this.regions.set(n,t),t}};export{d as ANNOUNCE_DEBOUNCE_MS,o as Announcer};
@@ -0,0 +1,14 @@
1
+ /** One appearance axis value as a consumer may pass it: a rung name, a presence flag, or nothing. */
2
+ export type AppearanceValue = string | boolean | null | undefined;
3
+ /**
4
+ * Resolves appearance axes to the `data-*` attributes the skin reads, so a
5
+ * consumer may set either the prop (`size="lg"`) or the attribute
6
+ * (`data-size="lg"`) and both render the same. The prop wins when both are
7
+ * given; `false`, `null` and `undefined` leave the attribute off; `true`
8
+ * writes a bare presence attribute.
9
+ *
10
+ * @param values - Axis name to prop value, e.g. `{ size, iconOnly }`; camelCase keys map to kebab-case attributes.
11
+ * @param attrs - The pass-through attributes the consumer supplied, read for `data-<axis>` fallbacks.
12
+ * @returns A `data-<axis>` record to spread after the pass-through attributes.
13
+ */
14
+ export declare function appearanceAttrs(values: Record<string, AppearanceValue>, attrs?: Record<string, unknown>): Record<string, string | undefined>;
@@ -0,0 +1 @@
1
+ function i(r,o={}){let n={};for(let a of Object.keys(r)){let t=`data-${a.replace(/[A-Z]/g,s=>`-${s.toLowerCase()}`)}`,e=r[a]??o[t];e==null||e===!1?n[t]=void 0:n[t]=e===!0?"":String(e)}return n}export{i as appearanceAttrs};
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Whether the carousel root should ignore this Arrow keypress, leaving it to whatever inside the carousel owns it.
3
+ *
4
+ * @param target the event's target
5
+ * @param root the carousel root the handler is attached to
6
+ */
7
+ export declare function arrowKeyBelongsToDescendant(target: EventTarget | null, root: Element): boolean;
@@ -0,0 +1 @@
1
+ var r=new Set(["textbox","searchbox","listbox","slider","spinbutton","menu","menubar","tablist","grid","treegrid","tree","combobox","radiogroup"]),o=new Set(["INPUT","SELECT","TEXTAREA","AUDIO","VIDEO"]);function l(e){if(o.has(e.tagName)||e.isContentEditable)return!0;let n=e.getAttribute("role");return n!==null&&r.has(n)}function u(e,n){if(!(e instanceof Element))return!1;let t=e;for(;t!==null&&t!==n;){if(l(t))return!0;t=t.parentElement}return!1}export{u as arrowKeyBelongsToDescendant};
@@ -0,0 +1,35 @@
1
+ /** How much of a name to render — the `Intl.DateTimeFormat` `month`/`weekday` widths. */
2
+ export type NameWidth = 'narrow' | 'short' | 'long';
3
+ /** The runtime's own locale, used whenever `locale` is omitted — matches what `toLocaleDateString()` would pick. */
4
+ export declare function resolveLocale(locale?: string): string;
5
+ /**
6
+ * The twelve month names of `locale`, January first, at the requested width.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * getMonthNames('fr-FR')[0]; // 'janvier'
11
+ * ```
12
+ */
13
+ export declare function getMonthNames(locale?: string, width?: NameWidth): string[];
14
+ /**
15
+ * The seven weekday names of `locale` at the requested width, rotated so index
16
+ * `0` is `weekStartsOn` (`0` = Sunday … `6` = Saturday).
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * getWeekDayNames('en-GB', 1, 'short'); // ['Mon', 'Tue', … 'Sun']
21
+ * ```
22
+ */
23
+ export declare function getWeekDayNames(locale?: string, weekStartsOn?: number, width?: NameWidth): string[];
24
+ /** The first day of the week `locale` uses (`0` = Sunday … `6` = Saturday), read from `Intl.Locale`'s week info, falling back to `0` on engines without it. */
25
+ export declare function getLocaleWeekStartsOn(locale?: string): 0 | 1 | 2 | 3 | 4 | 5 | 6;
26
+ /** The month heading label for `month` (e.g. `'janvier 2026'`), formatted for `locale`. */
27
+ export declare function formatMonthLabel(month: Date, locale?: string): string;
28
+ /** A bare year formatted for `locale` (e.g. `'2026'`, `'٢٠٢٦'` in `ar-EG`) using `Intl.NumberFormat` with grouping off, since a grouped `2,026` is not a year. */
29
+ export declare function formatYear(year: number, locale?: string): string;
30
+ /** A year page label (e.g. `'2020 – 2039'`), the year view's heading and grid name. */
31
+ export declare function formatYearRange(start: number, end: number, locale?: string): string;
32
+ /** A full, spoken-friendly date label (e.g. `'Monday, January 5, 2026'`) for live-region announcements. */
33
+ export declare function formatDateLabel(date: Date, locale?: string): string;
34
+ /** @internal Drops every memoized name list. */
35
+ export declare function clearLocaleNameCache(): void;
@@ -0,0 +1 @@
1
+ var s=new Date(2024,0,7),c=new Map;function m(t,e){let n=c.get(t);if(n)return n;let r=e();return c.set(t,r),r}function o(t){return t??new Intl.DateTimeFormat().resolvedOptions().locale}function D(t,e="long"){let n=o(t);return m(`m|${n}|${e}`,()=>{let r=new Intl.DateTimeFormat(n,{month:e,timeZone:"UTC"});return Array.from({length:12},(i,a)=>r.format(Date.UTC(2024,a,15)))})}function h(t,e=0,n="short"){let r=o(t),i=m(`w|${r}|${n}`,()=>{let u=new Intl.DateTimeFormat(r,{weekday:n});return Array.from({length:7},(f,l)=>u.format(new Date(s.getFullYear(),s.getMonth(),s.getDate()+l)))}),a=(e%7+7)%7;return i.slice(a).concat(i.slice(0,a))}function p(t){try{let e=new Intl.Locale(o(t)),n=(e.getWeekInfo?.()??e.weekInfo)?.firstDay;if(typeof n=="number")return n%7}catch{}return 0}function y(t,e){return t.toLocaleDateString(o(e),{month:"long",year:"numeric"})}function g(t,e){return new Intl.NumberFormat(o(e),{useGrouping:!1}).format(t)}function d(t,e,n){return`${g(t,n)} \u2013 ${g(e,n)}`}function w(t,e){return t.toLocaleDateString(o(e),{weekday:"long",year:"numeric",month:"long",day:"numeric"})}function b(){c.clear()}export{b as clearLocaleNameCache,w as formatDateLabel,y as formatMonthLabel,g as formatYear,d as formatYearRange,p as getLocaleWeekStartsOn,D as getMonthNames,h as getWeekDayNames,o as resolveLocale};
@@ -0,0 +1,80 @@
1
+ /** sRGB colour: `r`/`g`/`b` in `0–255`, `a` in `0–1`. */
2
+ export interface RgbColor {
3
+ r: number;
4
+ g: number;
5
+ b: number;
6
+ a: number;
7
+ }
8
+ /** HSL colour: `h` in `0–360` degrees, `s`/`l` in `0–100` percent, `a` in `0–1`. */
9
+ export interface HslColor {
10
+ h: number;
11
+ s: number;
12
+ l: number;
13
+ a: number;
14
+ }
15
+ /** HSB (a.k.a. HSV) colour: `h` in `0–360` degrees, `s`/`b` in `0–100` percent, `a` in `0–1`; `b` is brightness, not blue. */
16
+ export interface HsbColor {
17
+ h: number;
18
+ s: number;
19
+ b: number;
20
+ a: number;
21
+ }
22
+ /** Serialisation targets for {@link formatColor}; `'hsb'` is this library's own notation, not CSS, so it round-trips through {@link parseColor} but must not go in a stylesheet. */
23
+ export type ColorFormat = 'hex' | 'rgb' | 'hsl' | 'hsb';
24
+ /**
25
+ * Serialises an sRGB colour as `#rrggbb`, or `#rrggbbaa` when `includeAlpha` is set, clamping and rounding channels so a computed colour with `r: 255.4` still produces valid hex.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * rgbToHex({ r: 217, g: 76, b: 76, a: 0.5 }); // '#d94c4c'
30
+ * rgbToHex({ r: 217, g: 76, b: 76, a: 0.5 }, true); // '#d94c4c80'
31
+ * ```
32
+ */
33
+ export declare function rgbToHex(rgb: RgbColor, includeAlpha?: boolean): string;
34
+ /**
35
+ * Parses `#rgb`, `#rgba`, `#rrggbb` or `#rrggbbaa` into sRGB, returning `null` for anything else, including 5- and 7-digit strings that look like hex but aren't a colour.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * hexToRgb('#f00'); // { r: 255, g: 0, b: 0, a: 1 }
40
+ * hexToRgb('#ff000080'); // { r: 255, g: 0, b: 0, a: 0.502 }
41
+ * hexToRgb('nope'); // null
42
+ * ```
43
+ */
44
+ export declare function hexToRgb(hex: string): RgbColor | null;
45
+ /** sRGB → HSB. A greyscale colour reports hue `0`, because it genuinely has none. */
46
+ export declare function rgbToHsb(rgb: RgbColor): HsbColor;
47
+ /** HSB → sRGB. */
48
+ export declare function hsbToRgb(hsb: HsbColor): RgbColor;
49
+ /** sRGB → HSL. */
50
+ export declare function rgbToHsl(rgb: RgbColor): HslColor;
51
+ /** HSL → sRGB. */
52
+ export declare function hslToRgb(hsl: HslColor): RgbColor;
53
+ /** HSB → HSL, computed directly rather than via RGB, since the detour would quantise to 8 bits and flatten near-black hues. */
54
+ export declare function hsbToHsl(hsb: HsbColor): HslColor;
55
+ /** HSL → HSB, the exact inverse of {@link hsbToHsl}, also without an RGB detour. */
56
+ export declare function hslToHsb(hsl: HslColor): HsbColor;
57
+ /**
58
+ * Parses a colour string (hex, `rgb()`, `hsl()`, or this library's own `hsb()`) into the canonical {@link HsbColor}, returning `null` rather than throwing for anything unrecognized, including named colours.
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * parseColor('#d94c4c'); // { h: 0, s: 64.98, b: 85.1, a: 1 }
63
+ * parseColor('rgb(255 0 0 / 50%)'); // { h: 0, s: 100, b: 100, a: 0.5 }
64
+ * parseColor('hsl(210, 60%, 85%)'); // { h: 210, s: 19.15, b: 94, a: 1 }
65
+ * parseColor('rebeccapurple'); // null
66
+ * ```
67
+ */
68
+ export declare function parseColor(input: string): HsbColor | null;
69
+ /**
70
+ * Serialises the canonical {@link HsbColor} back to a string in `format`, omitting alpha only when it equals 1 unless `alpha: false` forces it off; round-trips through {@link parseColor} to the precision `format` can carry.
71
+ *
72
+ * @example
73
+ * ```ts
74
+ * formatColor({ h: 0, s: 100, b: 100, a: 1 }, 'hex'); // '#ff0000'
75
+ * formatColor({ h: 0, s: 100, b: 100, a: 0.5 }, 'hex'); // '#ff000080'
76
+ * formatColor({ h: 0, s: 100, b: 100, a: 0.5 }, 'rgb'); // 'rgba(255, 0, 0, 0.5)'
77
+ * formatColor({ h: 0, s: 100, b: 100, a: 0.5 }, 'hex', false); // '#ff0000'
78
+ * ```
79
+ */
80
+ export declare function formatColor(color: HsbColor, format: ColorFormat, alpha?: boolean): string;
@@ -0,0 +1 @@
1
+ function s(n,r,t){return Math.min(Math.max(n,r),t)}function b(n,r=0){let t=10**r;return Math.round(n*t)/t}function i(n){return(n%360+360)%360}function m(n){return s(Math.round(n),0,255).toString(16).padStart(2,"0")}function $(n,r,t,e,o){if(!o)return 0;let u;return e===n?u=(r-t)/o:e===r?u=(t-n)/o+2:u=(n-r)/o+4,i(u*60)}function d(n,r,t,e,o){let u=Math.floor(i(n)/60)%6,l=[[r,t,0],[t,r,0],[0,r,t],[0,t,r],[t,0,r],[r,0,t]],[c,a,x]=l[u]??[0,0,0];return{r:b((c+e)*255),g:b((a+e)*255),b:b((x+e)*255),a:o}}function M(n,r=!1){let t=`#${m(n.r)}${m(n.g)}${m(n.b)}`;return r?`${t}${m(s(n.a,0,1)*255)}`:t}var R=/^#?([\da-f]{3,8})$/i;function T(n){let r=R.exec(n.trim());if(!r)return null;let t=r[1];if((t.length===3||t.length===4)&&(t=t.split("").map(o=>o+o).join("")),t.length!==6&&t.length!==8)return null;let e=o=>parseInt(t.slice(o,o+2),16);return{r:e(0),g:e(2),b:e(4),a:t.length===8?b(e(6)/255,3):1}}function H(n){let r=s(n.r,0,255)/255,t=s(n.g,0,255)/255,e=s(n.b,0,255)/255,o=Math.max(r,t,e),u=o-Math.min(r,t,e);return{h:$(r,t,e,o,u),s:o?u/o*100:0,b:o*100,a:s(n.a,0,1)}}function C(n){let r=i(n.h),t=s(n.s,0,100)/100,e=s(n.b,0,100)/100,o=e*t,u=o*(1-Math.abs(r/60%2-1));return d(r,o,u,e-o,s(n.a,0,1))}function A(n){let r=s(n.r,0,255)/255,t=s(n.g,0,255)/255,e=s(n.b,0,255)/255,o=Math.max(r,t,e),u=Math.min(r,t,e),l=o-u,c=(o+u)/2,a=l?l/(1-Math.abs(2*c-1)):0;return{h:$(r,t,e,o,l),s:s(a*100,0,100),l:c*100,a:s(n.a,0,1)}}function E(n){let r=i(n.h),t=s(n.s,0,100)/100,e=s(n.l,0,100)/100,o=(1-Math.abs(2*e-1))*t,u=o*(1-Math.abs(r/60%2-1));return d(r,o,u,e-o/2,s(n.a,0,1))}function v(n){let r=s(n.s,0,100)/100,t=s(n.b,0,100)/100,e=t*(1-r/2),o=Math.min(e,1-e);return{h:i(n.h),s:o?(t-e)/o*100:0,l:e*100,a:s(n.a,0,1)}}function F(n){let r=s(n.s,0,100)/100,t=s(n.l,0,100)/100,e=t+r*Math.min(t,1-t);return{h:i(n.h),s:e?2*(1-t/e)*100:0,b:e*100,a:s(n.a,0,1)}}var N=/^(rgba?|hsla?|hsba?|hsva?)\(([^()]*)\)$/;function p(n){if(n===void 0)return null;let r=n.endsWith("%"),t=r?n.slice(0,-1):n.replace(/deg$/,"");if(t.trim()==="")return null;let e=Number(t);return Number.isFinite(e)?{value:e,percent:r}:null}function h(n){let r=p(n);return r&&(r.percent?r.value/100*255:r.value)}function g(n){let r=p(n);return r&&r.value}function y(n){if(n===void 0)return 1;let r=p(n);return r&&(r.percent?r.value/100:r.value)}function f(n){return{h:b(i(n.h),2),s:b(s(n.s,0,100),2),b:b(s(n.b,0,100),2),a:b(s(n.a,0,1),3)}}function P(n){if(typeof n!="string")return null;let r=n.trim().toLowerCase();if(!r)return null;let t=N.exec(r);if(!t){let u=T(r);return u?f(H(u)):null}let e=t[1].replace(/a$/,""),o=t[2].replace(/\//g," ").split(/[\s,]+/).filter(Boolean);return o.length!==3&&o.length!==4?null:O(e,o)}function O(n,r){let t=y(r[3]);if(t===null)return null;if(n==="rgb"){let l=h(r[0]),c=h(r[1]),a=h(r[2]);return l===null||c===null||a===null?null:f(H({r:l,g:c,b:a,a:t}))}let e=g(r[0]),o=g(r[1]),u=g(r[2]);return e===null||o===null||u===null?null:f(n==="hsl"?F({h:e,s:o,l:u,a:t}):{h:e,s:o,b:u,a:t})}function w(n,r,t=!0){let e=b(s(n.a,0,1),3),o=t&&e<1;if(r==="rgb"){let{r:u,g:l,b:c}=C(n);return o?`rgba(${u}, ${l}, ${c}, ${e})`:`rgb(${u}, ${l}, ${c})`}if(r==="hsl"){let u=v(n),l=b(u.h),c=b(u.s),a=b(u.l);return o?`hsla(${l}, ${c}%, ${a}%, ${e})`:`hsl(${l}, ${c}%, ${a}%)`}if(r==="hsb"){let u=b(i(n.h)),l=b(s(n.s,0,100)),c=b(s(n.b,0,100));return o?`hsba(${u}, ${l}%, ${c}%, ${e})`:`hsb(${u}, ${l}%, ${c}%)`}return M(C(n),o)}export{w as formatColor,T as hexToRgb,v as hsbToHsl,C as hsbToRgb,F as hslToHsb,E as hslToRgb,P as parseColor,M as rgbToHex,H as rgbToHsb,A as rgbToHsl};
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Whether two values are indistinguishable to a consumer, so no event is owed: `Object.is` for scalars, element-wise for the string arrays a selection carries.
3
+ *
4
+ * @param a the value now
5
+ * @param b the value proposed
6
+ */
7
+ export declare function sameControlledValue(a: unknown, b: unknown): boolean;
8
+ /** What the adapter currently holds on both sides of the controlled/uncontrolled split. */
9
+ export interface ControllableState<T> {
10
+ /** The consumer's controlled value; `undefined` means the control owns its own value. */
11
+ controlled: T | undefined;
12
+ /** The value the adapter holds while uncontrolled; ignored once `controlled` is defined. */
13
+ uncontrolled: T | undefined;
14
+ }
15
+ /** What the adapter should do about a proposed change. */
16
+ export interface ControllableDecision<T> {
17
+ /** The value in force after this decision — the proposal, or the current value when nothing changed. */
18
+ value: T | undefined;
19
+ /** Whether the adapter writes its own state; always `false` while controlled, since the consumer owns the value. */
20
+ write: boolean;
21
+ /** Whether the change event fires; only on an actual change, in both modes. */
22
+ emit: boolean;
23
+ }
24
+ /** The value in force: the controlled one when there is one, the adapter's own otherwise. */
25
+ export declare function controllableValue<T>({ controlled, uncontrolled, }: ControllableState<T>): T | undefined;
26
+ /** Whether the consumer owns the value, which is exactly "a controlled value was supplied". */
27
+ export declare function isControlled<T>({ controlled }: ControllableState<T>): boolean;
28
+ /**
29
+ * The decision for one proposed change.
30
+ *
31
+ * @param state what the adapter holds on both sides
32
+ * @param next the proposed value
33
+ * @returns the value in force, whether to write it, and whether to emit
34
+ */
35
+ export declare function decideControllable<T>(state: ControllableState<T>, next: T | undefined): ControllableDecision<T>;
36
+ /**
37
+ * The decision for a form reset, which restores `defaultValue` as it reads *now* — a consumer that changed the prop after mount expects the new default back, not the one the control was born with.
38
+ *
39
+ * @param state what the adapter holds on both sides
40
+ * @param liveDefault the `defaultValue` prop read at reset time
41
+ */
42
+ export declare function decideReset<T>(state: ControllableState<T>, liveDefault: T | undefined): ControllableDecision<T>;
@@ -0,0 +1 @@
1
+ import{sameSelection as t}from"./selection.js";function o(e,n){return Object.is(e,n)?!0:!Array.isArray(e)||!Array.isArray(n)||!e.every(r=>typeof r=="string")||!n.every(r=>typeof r=="string")?!1:t(e,n)}function l({controlled:e,uncontrolled:n}){return e!==void 0?e:n}function i({controlled:e}){return e!==void 0}function u(e,n){let r=l(e);return o(r,n)?{value:r,write:!1,emit:!1}:{value:n,write:!i(e),emit:!0}}function f(e,n){return u(e,n)}export{l as controllableValue,u as decideControllable,f as decideReset,i as isControlled,o as sameControlledValue};
@@ -0,0 +1,43 @@
1
+ /** One output column: the row key to read and, optionally, the header text to print instead of the key. */
2
+ export interface CsvColumn<Row> {
3
+ /** Property of each row whose value fills this column. */
4
+ key: keyof Row & string;
5
+ /**
6
+ * Header cell text.
7
+ *
8
+ * @default the key itself
9
+ */
10
+ label?: string | undefined;
11
+ }
12
+ /** Output options for {@link toCsv}; every field has a working default. */
13
+ export interface CsvOptions<Row> {
14
+ /**
15
+ * Columns to emit, in order; omit to emit every key of the first row.
16
+ *
17
+ * @default Object.keys(rows[0])
18
+ */
19
+ columns?: readonly (CsvColumn<Row> | (keyof Row & string))[] | undefined;
20
+ /**
21
+ * Field separator.
22
+ *
23
+ * @default ','
24
+ */
25
+ delimiter?: string | undefined;
26
+ /**
27
+ * Whether the first line is the header row.
28
+ *
29
+ * @default true
30
+ */
31
+ header?: boolean | undefined;
32
+ }
33
+ /**
34
+ * Serialises rows to RFC 4180 CSV text — CRLF line ends, fields quoted only when
35
+ * they contain the delimiter, a quote or a line break — ready for a Blob or a
36
+ * data: URL. Dates print as ISO 8601; null and undefined print as empty fields.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * toCsv(rows, { columns: [{ key: 'name', label: 'Name' }, 'amount'] });
41
+ * ```
42
+ */
43
+ export declare function toCsv<Row extends object>(rows: readonly Row[], options?: CsvOptions<Row>): string;
@@ -0,0 +1,2 @@
1
+ function g(n){return n==null?"":n instanceof Date?n.toISOString():typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"||typeof n=="bigint"?String(n):JSON.stringify(n)??""}function f(n,o){let e=g(n);return/["\r\n]/.test(e)||e.includes(o)?`"${e.replace(/"/g,'""')}"`:e}function c(n,o={}){let e=o.delimiter??",",s=n[0],r=(o.columns??(s?Object.keys(s):[])).map(t=>typeof t=="string"?{key:t}:t),i=[];o.header!==!1&&r.length&&i.push(r.map(t=>f(t.label??t.key,e)).join(e));for(let t of n)i.push(r.map(d=>f(t[d.key],e)).join(e));return i.join(`\r
2
+ `)}export{c as toCsv};