@spfx-fast/sharepoint-ui 0.4.2 → 0.5.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 (276) hide show
  1. package/QUICKSTART.md +18 -0
  2. package/README.md +19 -24
  3. package/components.json +240 -5694
  4. package/dist/accordion.d.ts +11 -0
  5. package/dist/accordion.js +4 -0
  6. package/dist/alert.d.ts +3 -0
  7. package/dist/alert.js +4 -0
  8. package/dist/attachment-list.d.ts +15 -0
  9. package/dist/attachment-list.js +14 -0
  10. package/dist/avatar-group.d.ts +12 -0
  11. package/dist/avatar-group.js +7 -0
  12. package/dist/avatar.d.ts +6 -0
  13. package/dist/avatar.js +5 -0
  14. package/dist/badge.d.ts +3 -0
  15. package/dist/badge.js +4 -0
  16. package/dist/breadcrumb.d.ts +10 -0
  17. package/dist/breadcrumb.js +9 -0
  18. package/dist/button-group.d.ts +6 -0
  19. package/dist/button-group.js +4 -0
  20. package/dist/button.d.ts +3 -0
  21. package/dist/button.js +4 -0
  22. package/dist/card.d.ts +3 -0
  23. package/dist/card.js +4 -0
  24. package/dist/carousel.d.ts +11 -0
  25. package/dist/carousel.js +6 -0
  26. package/dist/checkbox.d.ts +3 -0
  27. package/dist/checkbox.js +4 -0
  28. package/dist/combobox.d.ts +9 -0
  29. package/dist/combobox.js +6 -0
  30. package/dist/command-bar.d.ts +6 -0
  31. package/dist/command-bar.js +4 -0
  32. package/dist/copy-button.d.ts +7 -0
  33. package/dist/copy-button.js +19 -0
  34. package/dist/data-grid.d.ts +25 -0
  35. package/dist/data-grid.js +39 -0
  36. package/dist/date-range-picker.d.ts +12 -0
  37. package/dist/date-range-picker.js +4 -0
  38. package/dist/dialog.d.ts +9 -0
  39. package/dist/dialog.js +21 -0
  40. package/dist/divider.d.ts +3 -0
  41. package/dist/divider.js +4 -0
  42. package/dist/drawer.d.ts +6 -0
  43. package/dist/drawer.js +5 -0
  44. package/dist/empty-state.d.ts +7 -0
  45. package/dist/empty-state.js +5 -0
  46. package/dist/field.d.ts +15 -0
  47. package/dist/field.js +11 -0
  48. package/dist/file-dropzone.d.ts +15 -0
  49. package/dist/file-dropzone.js +21 -0
  50. package/dist/filter-bar.d.ts +9 -0
  51. package/dist/filter-bar.js +9 -0
  52. package/dist/image.d.ts +5 -0
  53. package/dist/image.js +4 -0
  54. package/dist/index.d.ts +68 -76
  55. package/dist/index.js +60 -66
  56. package/dist/input.d.ts +3 -0
  57. package/dist/input.js +4 -0
  58. package/dist/label.d.ts +3 -0
  59. package/dist/label.js +4 -0
  60. package/dist/link.d.ts +3 -0
  61. package/dist/link.js +9 -0
  62. package/dist/list-view.d.ts +29 -0
  63. package/dist/list-view.js +14 -0
  64. package/dist/list.d.ts +6 -0
  65. package/dist/list.js +5 -0
  66. package/dist/lookup-picker.d.ts +12 -0
  67. package/dist/lookup-picker.js +4 -0
  68. package/dist/menu.d.ts +6 -0
  69. package/dist/menu.js +4 -0
  70. package/dist/nav.d.ts +12 -0
  71. package/dist/nav.js +4 -0
  72. package/dist/pagination.d.ts +11 -0
  73. package/dist/pagination.js +5 -0
  74. package/dist/person-picker.d.ts +13 -0
  75. package/dist/person-picker.js +4 -0
  76. package/dist/persona.d.ts +7 -0
  77. package/dist/persona.js +5 -0
  78. package/dist/popover.d.ts +6 -0
  79. package/dist/popover.js +4 -0
  80. package/dist/progress-bar.d.ts +5 -0
  81. package/dist/progress-bar.js +5 -0
  82. package/dist/radio-group.d.ts +6 -0
  83. package/dist/radio-group.js +4 -0
  84. package/dist/radio.d.ts +3 -0
  85. package/dist/radio.js +4 -0
  86. package/dist/rating.d.ts +8 -0
  87. package/dist/rating.js +5 -0
  88. package/dist/react.d.ts +1 -4583
  89. package/dist/react.js +1 -6837
  90. package/dist/select.d.ts +3 -0
  91. package/dist/select.js +4 -0
  92. package/dist/sharepoint-field.d.ts +18 -0
  93. package/dist/sharepoint-field.js +54 -0
  94. package/dist/skeleton.d.ts +6 -0
  95. package/dist/skeleton.js +9 -0
  96. package/dist/spinner.d.ts +5 -0
  97. package/dist/spinner.js +4 -0
  98. package/dist/swatch-picker.d.ts +17 -0
  99. package/dist/swatch-picker.js +11 -0
  100. package/dist/switch.d.ts +3 -0
  101. package/dist/switch.js +4 -0
  102. package/dist/table.d.ts +6 -0
  103. package/dist/table.js +4 -0
  104. package/dist/tabs.d.ts +14 -0
  105. package/dist/tabs.js +30 -0
  106. package/dist/tag-group.d.ts +6 -0
  107. package/dist/tag-group.js +4 -0
  108. package/dist/tag-picker.d.ts +12 -0
  109. package/dist/tag-picker.js +4 -0
  110. package/dist/tag.d.ts +7 -0
  111. package/dist/tag.js +5 -0
  112. package/dist/text.d.ts +5 -0
  113. package/dist/text.js +4 -0
  114. package/dist/textarea.d.ts +3 -0
  115. package/dist/textarea.js +4 -0
  116. package/dist/theme.d.ts +15 -167
  117. package/dist/theme.js +36 -162
  118. package/dist/toast.d.ts +9 -0
  119. package/dist/toast.js +12 -0
  120. package/dist/tree.d.ts +13 -0
  121. package/dist/tree.js +9 -0
  122. package/dist/view-card.d.ts +8 -0
  123. package/dist/view-card.js +4 -0
  124. package/dist/view-switcher.d.ts +13 -0
  125. package/dist/view-switcher.js +7 -0
  126. package/dist/virtual-list.d.ts +11 -0
  127. package/dist/virtual-list.js +25 -0
  128. package/measurements.json +365 -0
  129. package/package.json +19 -42
  130. package/src/theme.css +125 -0
  131. package/AGENTS.md +0 -211
  132. package/dist/appearance.d.ts +0 -6
  133. package/dist/appearance.js +0 -217
  134. package/dist/elements/accordion.d.ts +0 -9
  135. package/dist/elements/accordion.js +0 -338
  136. package/dist/elements/alert.d.ts +0 -2
  137. package/dist/elements/alert.js +0 -62
  138. package/dist/elements/avatar-group-primitives.d.ts +0 -3
  139. package/dist/elements/avatar-group-primitives.js +0 -189
  140. package/dist/elements/avatar-group.d.ts +0 -2
  141. package/dist/elements/avatar-group.js +0 -110
  142. package/dist/elements/avatar.d.ts +0 -4
  143. package/dist/elements/avatar.js +0 -251
  144. package/dist/elements/badge.d.ts +0 -8
  145. package/dist/elements/badge.js +0 -182
  146. package/dist/elements/breadcrumb.d.ts +0 -4
  147. package/dist/elements/breadcrumb.js +0 -233
  148. package/dist/elements/button-group.d.ts +0 -1
  149. package/dist/elements/button-group.js +0 -20
  150. package/dist/elements/button-variants.d.ts +0 -6
  151. package/dist/elements/button-variants.js +0 -339
  152. package/dist/elements/button.d.ts +0 -5
  153. package/dist/elements/button.js +0 -233
  154. package/dist/elements/card-primitives.d.ts +0 -3
  155. package/dist/elements/card-primitives.js +0 -83
  156. package/dist/elements/card.d.ts +0 -5
  157. package/dist/elements/card.js +0 -213
  158. package/dist/elements/carousel.d.ts +0 -92
  159. package/dist/elements/carousel.js +0 -1112
  160. package/dist/elements/color-picker.d.ts +0 -24
  161. package/dist/elements/color-picker.js +0 -1004
  162. package/dist/elements/combobox.d.ts +0 -1
  163. package/dist/elements/combobox.js +0 -1012
  164. package/dist/elements/data-grid-model.d.ts +0 -117
  165. package/dist/elements/data-grid-model.js +0 -294
  166. package/dist/elements/data-grid.d.ts +0 -29
  167. package/dist/elements/data-grid.js +0 -1567
  168. package/dist/elements/date-picker.d.ts +0 -1
  169. package/dist/elements/date-picker.js +0 -486
  170. package/dist/elements/dialog.d.ts +0 -23
  171. package/dist/elements/dialog.js +0 -409
  172. package/dist/elements/divider.d.ts +0 -2
  173. package/dist/elements/divider.js +0 -66
  174. package/dist/elements/drawer.d.ts +0 -3
  175. package/dist/elements/drawer.js +0 -308
  176. package/dist/elements/field-composition.d.ts +0 -26
  177. package/dist/elements/field-composition.js +0 -133
  178. package/dist/elements/field.d.ts +0 -1
  179. package/dist/elements/field.js +0 -67
  180. package/dist/elements/file-upload.d.ts +0 -6
  181. package/dist/elements/file-upload.js +0 -211
  182. package/dist/elements/floating-position.d.ts +0 -26
  183. package/dist/elements/floating-position.js +0 -39
  184. package/dist/elements/image.d.ts +0 -28
  185. package/dist/elements/image.js +0 -38
  186. package/dist/elements/info.d.ts +0 -9
  187. package/dist/elements/info.js +0 -102
  188. package/dist/elements/input.d.ts +0 -5
  189. package/dist/elements/input.js +0 -255
  190. package/dist/elements/label.d.ts +0 -15
  191. package/dist/elements/label.js +0 -56
  192. package/dist/elements/link.d.ts +0 -1
  193. package/dist/elements/link.js +0 -92
  194. package/dist/elements/list.d.ts +0 -19
  195. package/dist/elements/list.js +0 -297
  196. package/dist/elements/menu.d.ts +0 -33
  197. package/dist/elements/menu.js +0 -1103
  198. package/dist/elements/message-bar.d.ts +0 -10
  199. package/dist/elements/message-bar.js +0 -299
  200. package/dist/elements/nav.d.ts +0 -32
  201. package/dist/elements/nav.js +0 -791
  202. package/dist/elements/overflow.d.ts +0 -9
  203. package/dist/elements/overflow.js +0 -218
  204. package/dist/elements/persona.d.ts +0 -3
  205. package/dist/elements/persona.js +0 -125
  206. package/dist/elements/popover.d.ts +0 -77
  207. package/dist/elements/popover.js +0 -840
  208. package/dist/elements/progress-bar.d.ts +0 -4
  209. package/dist/elements/progress-bar.js +0 -82
  210. package/dist/elements/radio-group.d.ts +0 -1
  211. package/dist/elements/radio-group.js +0 -303
  212. package/dist/elements/rating-display.d.ts +0 -2
  213. package/dist/elements/rating-display.js +0 -125
  214. package/dist/elements/rating.d.ts +0 -2
  215. package/dist/elements/rating.js +0 -206
  216. package/dist/elements/rich-text-editor.d.ts +0 -18
  217. package/dist/elements/rich-text-editor.js +0 -508
  218. package/dist/elements/search.d.ts +0 -3
  219. package/dist/elements/search.js +0 -207
  220. package/dist/elements/select.d.ts +0 -6
  221. package/dist/elements/select.js +0 -291
  222. package/dist/elements/shared.d.ts +0 -19
  223. package/dist/elements/shared.js +0 -396
  224. package/dist/elements/skeleton.d.ts +0 -6
  225. package/dist/elements/skeleton.js +0 -91
  226. package/dist/elements/slider.d.ts +0 -1
  227. package/dist/elements/slider.js +0 -248
  228. package/dist/elements/spin-button.d.ts +0 -7
  229. package/dist/elements/spin-button.js +0 -499
  230. package/dist/elements/spinner.d.ts +0 -4
  231. package/dist/elements/spinner.js +0 -124
  232. package/dist/elements/swatch-picker.d.ts +0 -5
  233. package/dist/elements/swatch-picker.js +0 -363
  234. package/dist/elements/table.d.ts +0 -21
  235. package/dist/elements/table.js +0 -261
  236. package/dist/elements/tabs.d.ts +0 -1
  237. package/dist/elements/tabs.js +0 -276
  238. package/dist/elements/tag-picker.d.ts +0 -29
  239. package/dist/elements/tag-picker.js +0 -697
  240. package/dist/elements/tags.d.ts +0 -21
  241. package/dist/elements/tags.js +0 -421
  242. package/dist/elements/teaching-popover.d.ts +0 -32
  243. package/dist/elements/teaching-popover.js +0 -412
  244. package/dist/elements/text.d.ts +0 -9
  245. package/dist/elements/text.js +0 -75
  246. package/dist/elements/textarea.d.ts +0 -1
  247. package/dist/elements/textarea.js +0 -182
  248. package/dist/elements/toast.d.ts +0 -25
  249. package/dist/elements/toast.js +0 -337
  250. package/dist/elements/toaster.d.ts +0 -6
  251. package/dist/elements/toaster.js +0 -356
  252. package/dist/elements/toggle.d.ts +0 -2
  253. package/dist/elements/toggle.js +0 -246
  254. package/dist/elements/toolbar.d.ts +0 -12
  255. package/dist/elements/toolbar.js +0 -381
  256. package/dist/elements/tooltip.d.ts +0 -76
  257. package/dist/elements/tooltip.js +0 -510
  258. package/dist/elements/tree-model.d.ts +0 -19
  259. package/dist/elements/tree-model.js +0 -34
  260. package/dist/elements/tree.d.ts +0 -5
  261. package/dist/elements/tree.js +0 -273
  262. package/dist/elements/view-card.d.ts +0 -2
  263. package/dist/elements/view-card.js +0 -78
  264. package/dist/elements/virtual-list.d.ts +0 -41
  265. package/dist/elements/virtual-list.js +0 -369
  266. package/dist/elements.d.ts +0 -72
  267. package/dist/elements.js +0 -207
  268. package/dist/virtualizer-hooks.d.ts +0 -80
  269. package/dist/virtualizer-hooks.js +0 -253
  270. package/scripts/generate-token-index.mjs +0 -43
  271. package/scripts/sync-component-catalog-signatures.mjs +0 -55
  272. package/scripts/validate-component-catalog.mjs +0 -44
  273. package/skills/sharepoint-ui/SKILL.md +0 -12
  274. package/skills/sharepoint-ui/references/choosing-components.md +0 -20
  275. package/skills/sharepoint-ui/references/sharepoint-patterns.md +0 -17
  276. package/tokens.json +0 -3777
package/dist/elements.js DELETED
@@ -1,207 +0,0 @@
1
- import { defineButton } from "./elements/button.js";
2
- import { defineButtonGroup } from "./elements/button-group.js";
3
- import { defineCompoundButton, defineMenuButton, defineSplitButton, defineToggleButton } from "./elements/button-variants.js";
4
- import { defineInput } from "./elements/input.js";
5
- import { defineFileUpload } from "./elements/file-upload.js";
6
- import { defineField } from "./elements/field.js";
7
- import { defineCard } from "./elements/card.js";
8
- import { defineCardFooter, defineCardHeader, defineCardPreview } from "./elements/card-primitives.js";
9
- import { defineBadge, defineCounterBadge, definePresenceBadge } from "./elements/badge.js";
10
- import { defineCheckbox, defineSwitch } from "./elements/toggle.js";
11
- import { defineTextArea } from "./elements/textarea.js";
12
- import { defineSpinner } from "./elements/spinner.js";
13
- import { defineMessageBar } from "./elements/message-bar.js";
14
- import { defineViewCard } from "./elements/view-card.js";
15
- import { defineDialog } from "./elements/dialog.js";
16
- import { defineDrawer, defineInlineDrawer } from "./elements/drawer.js";
17
- import { defineProgressBar } from "./elements/progress-bar.js";
18
- import { defineSelect } from "./elements/select.js";
19
- import { defineRadioGroup } from "./elements/radio-group.js";
20
- import { defineSpinButton } from "./elements/spin-button.js";
21
- import { defineSlider } from "./elements/slider.js";
22
- import { defineDatePicker } from "./elements/date-picker.js";
23
- import { defineCombobox } from "./elements/combobox.js";
24
- import { defineRichTextEditor } from "./elements/rich-text-editor.js";
25
- import { defineAlert } from "./elements/alert.js";
26
- import { defineSkeleton } from "./elements/skeleton.js";
27
- import { defineLink } from "./elements/link.js";
28
- import { defineDivider } from "./elements/divider.js";
29
- import { defineAccordion } from "./elements/accordion.js";
30
- import { defineAvatar } from "./elements/avatar.js";
31
- import { defineAvatarGroup } from "./elements/avatar-group.js";
32
- import { defineAvatarGroupItem, defineAvatarGroupPopover } from "./elements/avatar-group-primitives.js";
33
- import { definePersona } from "./elements/persona.js";
34
- import { defineVirtualList } from "./elements/virtual-list.js";
35
- import { defineDataGrid } from "./elements/data-grid.js";
36
- import { defineTree } from "./elements/tree.js";
37
- import { defineInteractionTag, defineTag, defineTagGroup } from "./elements/tags.js";
38
- import { defineTagPicker } from "./elements/tag-picker.js";
39
- import { defineRating } from "./elements/rating.js";
40
- import { defineRatingDisplay, defineRatingItem } from "./elements/rating-display.js";
41
- import { defineList, defineListItem } from "./elements/list.js";
42
- import { defineBreadcrumb, defineBreadcrumbButton, defineBreadcrumbDivider, defineBreadcrumbItem } from "./elements/breadcrumb.js";
43
- import { defineTabs } from "./elements/tabs.js";
44
- import { defineTooltip } from "./elements/tooltip.js";
45
- import { definePopover } from "./elements/popover.js";
46
- import { defineTeachingPopover } from "./elements/teaching-popover.js";
47
- import { defineMenu, defineMenuItem, defineMenuDivider, defineMenuGroup, defineMenuGroupHeader, defineMenuBar, defineMenuBarItem } from "./elements/menu.js";
48
- import { defineText } from "./elements/text.js";
49
- import { defineToast } from "./elements/toast.js";
50
- import { defineToaster } from "./elements/toaster.js";
51
- import { defineSearchBox } from "./elements/search.js";
52
- import { defineColorPicker } from "./elements/color-picker.js";
53
- import { defineToolbar } from "./elements/toolbar.js";
54
- import { defineNav } from "./elements/nav.js";
55
- import { defineInfoButton } from "./elements/info.js";
56
- import { defineCarousel } from "./elements/carousel.js";
57
- import { defineOverflow } from "./elements/overflow.js";
58
- import { defineSwatchPicker } from "./elements/swatch-picker.js";
59
- import { defineTable } from "./elements/table.js";
60
- export { createLabel, getLabelStyle } from "./elements/label.js";
61
- export { defineInfoButton, createInfoLabel } from "./elements/info.js";
62
- export { defineCarousel, defineCarouselCard, defineCarouselNav, defineCarouselNavButton, defineCarouselNavImageButton, defineCarouselButton, defineCarouselAutoplayButton, defineCarouselNavContainer, defineCarouselSlider, defineCarouselViewport } from "./elements/carousel.js";
63
- export { defineOverflow, defineOverflowItem, defineOverflowDivider } from "./elements/overflow.js";
64
- export { defineSwatchPicker, defineColorSwatch, defineImageSwatch, defineEmptySwatch, defineSwatchPickerRow } from "./elements/swatch-picker.js";
65
- export { createTableColumn, defineTable, defineTableHeader, defineTableBody, defineTableRow, defineTableHeaderCell, defineTableCell, defineTableCellLayout, defineTableCellActions, defineTableResizeHandle, defineTableSelectionCell } from "./elements/table.js";
66
- export { defineButton } from "./elements/button.js";
67
- export { defineButtonGroup } from "./elements/button-group.js";
68
- export { defineCompoundButton, defineMenuButton, defineSplitButton, defineToggleButton } from "./elements/button-variants.js";
69
- export { defineInput } from "./elements/input.js";
70
- export { defineFileUpload } from "./elements/file-upload.js";
71
- export { createImage, getImageStyle } from "./elements/image.js";
72
- export { defineField } from "./elements/field.js";
73
- export { createFormField } from "./elements/field-composition.js";
74
- export { defineCard } from "./elements/card.js";
75
- export { defineCardFooter, defineCardHeader, defineCardPreview } from "./elements/card-primitives.js";
76
- export { defineBadge, defineCounterBadge, definePresenceBadge } from "./elements/badge.js";
77
- export { defineCheckbox, defineSwitch } from "./elements/toggle.js";
78
- export { defineTextArea } from "./elements/textarea.js";
79
- export { defineSpinner } from "./elements/spinner.js";
80
- export { defineMessageBar, defineMessageBarActions, defineMessageBarBody, defineMessageBarGroup, defineMessageBarTitle } from "./elements/message-bar.js";
81
- export { defineViewCard } from "./elements/view-card.js";
82
- export { defineDialog, defineDialogActions, defineDialogBody, defineDialogContent, defineDialogSurface, defineDialogTitle, defineDialogTrigger } from "./elements/dialog.js";
83
- export { defineDrawer, defineInlineDrawer } from "./elements/drawer.js";
84
- export { defineProgressBar } from "./elements/progress-bar.js";
85
- export { defineSelect } from "./elements/select.js";
86
- export { defineRadioGroup } from "./elements/radio-group.js";
87
- export { defineSpinButton } from "./elements/spin-button.js";
88
- export { defineSlider } from "./elements/slider.js";
89
- export { defineDatePicker } from "./elements/date-picker.js";
90
- export { defineCombobox } from "./elements/combobox.js";
91
- export { defineRichTextEditor } from "./elements/rich-text-editor.js";
92
- export { defineAlert } from "./elements/alert.js";
93
- export { defineSkeleton, defineSkeletonItem } from "./elements/skeleton.js";
94
- export { defineLink } from "./elements/link.js";
95
- export { defineDivider } from "./elements/divider.js";
96
- export { defineAccordion, defineAccordionHeader, defineAccordionPanel } from "./elements/accordion.js";
97
- export { defineAvatar } from "./elements/avatar.js";
98
- export { defineAvatarGroup } from "./elements/avatar-group.js";
99
- export { defineAvatarGroupItem, defineAvatarGroupPopover } from "./elements/avatar-group-primitives.js";
100
- export { definePersona } from "./elements/persona.js";
101
- export { defineVirtualList } from "./elements/virtual-list.js";
102
- export { defineDataGrid } from "./elements/data-grid.js";
103
- export { clampDataGridRowHeight, fitDataGridColumnWidths, formatDataGridClipboard, getDataGridColumnSizing, isDataGridRowSelected, parseDataGridClipboard, parseDataGridClipboardValue, setDataGridRowSelected, writeDataGridClipboardText } from "./elements/data-grid-model.js";
104
- export { defineTree } from "./elements/tree.js";
105
- export { defineInteractionTag, defineInteractionTagPrimary, defineInteractionTagSecondary, defineTag, defineTagGroup } from "./elements/tags.js";
106
- export { defineTagPicker } from "./elements/tag-picker.js";
107
- export { defineRating } from "./elements/rating.js";
108
- export { defineRatingDisplay, defineRatingItem } from "./elements/rating-display.js";
109
- export { defineList, defineListItem } from "./elements/list.js";
110
- export { defineBreadcrumb, defineBreadcrumbButton, defineBreadcrumbDivider, defineBreadcrumbItem } from "./elements/breadcrumb.js";
111
- export { defineTabs } from "./elements/tabs.js";
112
- export { defineTooltip } from "./elements/tooltip.js";
113
- export { definePopover, definePopoverSurface, definePopoverTrigger } from "./elements/popover.js";
114
- export { defineTeachingPopover } from "./elements/teaching-popover.js";
115
- export { defineMenu, defineMenuItem, defineMenuItemLink, defineMenuDivider, defineMenuGroup, defineMenuGroupHeader, defineMenuList, defineMenuPopover, defineMenuSplitGroup, defineMenuTrigger, defineMenuBar, defineMenuBarItem } from "./elements/menu.js";
116
- export { defineText } from "./elements/text.js";
117
- export { defineToast, defineToastBody, defineToastFooter, defineToastTitle } from "./elements/toast.js";
118
- export { defineToaster } from "./elements/toaster.js";
119
- export { defineSearchBox } from "./elements/search.js";
120
- export { defineColorPicker, defineColorArea, defineColorSlider, defineAlphaSlider } from "./elements/color-picker.js";
121
- export { defineToolbar, defineToolbarGroup, defineToolbarSeparator, defineToolbarRadioGroup, defineToolbarRadioButton } from "./elements/toolbar.js";
122
- export { defineNav, defineNavItem, defineAppItem, defineAppItemStatic, defineHamburger, defineNavDrawer, defineNavDrawerBody, defineNavDrawerFooter, defineNavDrawerHeader, defineSplitNavItem, defineNavCategory, defineNavCategoryItem, defineNavSubItemGroup, defineNavSubItem, defineNavDivider, defineNavSectionHeader } from "./elements/nav.js";
123
- /** Register every current custom element. Import an element-specific entrypoint to keep a package slice small. */
124
- export function defineSharePointUIElements() {
125
- defineButton();
126
- defineButtonGroup();
127
- defineCompoundButton();
128
- defineMenuButton();
129
- defineToggleButton();
130
- defineSplitButton();
131
- defineInput();
132
- defineFileUpload();
133
- defineField();
134
- defineCard();
135
- defineCardHeader();
136
- defineCardFooter();
137
- defineCardPreview();
138
- defineBadge();
139
- defineCounterBadge();
140
- definePresenceBadge();
141
- defineCheckbox();
142
- defineSwitch();
143
- defineTextArea();
144
- defineSpinner();
145
- defineMessageBar();
146
- defineViewCard();
147
- defineDialog();
148
- defineDrawer();
149
- defineInlineDrawer();
150
- defineProgressBar();
151
- defineSelect();
152
- defineRadioGroup();
153
- defineSpinButton();
154
- defineSlider();
155
- defineDatePicker();
156
- defineCombobox();
157
- defineRichTextEditor();
158
- defineAlert();
159
- defineSkeleton();
160
- defineLink();
161
- defineDivider();
162
- defineAccordion();
163
- defineAvatar();
164
- defineAvatarGroup();
165
- defineAvatarGroupItem();
166
- defineAvatarGroupPopover();
167
- definePersona();
168
- defineVirtualList();
169
- defineDataGrid();
170
- defineTree();
171
- defineTag();
172
- defineTagGroup();
173
- defineInteractionTag();
174
- defineTagPicker();
175
- defineRating();
176
- defineRatingDisplay();
177
- defineRatingItem();
178
- defineList();
179
- defineListItem();
180
- defineBreadcrumb();
181
- defineBreadcrumbItem();
182
- defineBreadcrumbButton();
183
- defineBreadcrumbDivider();
184
- defineTabs();
185
- defineTooltip();
186
- definePopover();
187
- defineTeachingPopover();
188
- defineMenu();
189
- defineMenuItem();
190
- defineMenuDivider();
191
- defineMenuGroup();
192
- defineMenuGroupHeader();
193
- defineMenuBar();
194
- defineMenuBarItem();
195
- defineText();
196
- defineToast();
197
- defineToaster();
198
- defineSearchBox();
199
- defineColorPicker();
200
- defineToolbar();
201
- defineNav();
202
- defineInfoButton();
203
- defineCarousel();
204
- defineOverflow();
205
- defineSwatchPicker();
206
- defineTable();
207
- }
@@ -1,80 +0,0 @@
1
- import * as React from "react";
2
- export type VirtualizerMeasureProps = {
3
- defaultItemSize: number;
4
- direction?: "vertical" | "horizontal";
5
- bufferItems?: number;
6
- bufferSize?: number;
7
- };
8
- export type VirtualizerContextMeasureProps = {
9
- contextIndex: number;
10
- setContextIndex: (index: number) => void;
11
- childProgressiveSizes: React.MutableRefObject<number[]>;
12
- };
13
- export type VirtualizerMeasureDynamicProps = VirtualizerMeasureProps & {
14
- virtualizerContext: VirtualizerContextMeasureProps;
15
- numItems: number;
16
- getItemSize: (index: number) => number;
17
- };
18
- export interface IndexedResizeCallbackElement {
19
- handleResize: () => void;
20
- }
21
- /** Measure a fixed-size viewport and calculate a bounded item window. */
22
- export declare function useStaticVirtualizerMeasure<TElement extends HTMLElement = HTMLElement>(props: VirtualizerMeasureProps): {
23
- virtualizerLength: number;
24
- bufferItems: number;
25
- bufferSize: number;
26
- scrollRef: (element: TElement | null) => void;
27
- containerSizeRef: React.MutableRefObject<number>;
28
- };
29
- /** Measure only enough variable-size rows to cover the current scroll viewport. */
30
- export declare function useDynamicVirtualizerMeasure<TElement extends HTMLElement = HTMLElement>(props: VirtualizerMeasureDynamicProps): {
31
- virtualizerLength: number;
32
- bufferItems: number;
33
- bufferSize: number;
34
- scrollRef: (element: TElement | null) => void;
35
- containerSizeRef: React.RefObject<number>;
36
- updateScrollPosition: (position: number) => void;
37
- };
38
- /** Track measured widths/heights by item index for legacy dynamic virtualizer composition. */
39
- export declare function useMeasureList<TElement extends HTMLElement & IndexedResizeCallbackElement = HTMLElement & IndexedResizeCallbackElement>(currentIndex: number, _refLength: number, totalLength: number, defaultItemSize: number): {
40
- widthArray: React.MutableRefObject<number[]>;
41
- heightArray: React.MutableRefObject<number[]>;
42
- createIndexedRef: (index: number) => (element: TElement | null) => void;
43
- refArray: React.MutableRefObject<Array<TElement | undefined | null>>;
44
- sizeUpdateCount: number;
45
- };
46
- export type ResizeCallbackWithRef = (entries: ResizeObserverEntry[], observer: ResizeObserver, scrollRef?: React.MutableRefObject<HTMLElement | null>) => void;
47
- export type ScrollToItemStaticParams = {
48
- index: number;
49
- itemSize: number;
50
- totalItems: number;
51
- scrollViewRef: React.RefObject<HTMLElement | null>;
52
- axis?: "horizontal" | "vertical";
53
- reversed?: boolean;
54
- behavior?: ScrollBehavior;
55
- };
56
- export type ScrollToItemDynamicParams = {
57
- index: number;
58
- itemSizes: React.RefObject<number[] | null>;
59
- totalSize: number;
60
- scrollViewRef: React.RefObject<HTMLElement | null>;
61
- axis?: "horizontal" | "vertical";
62
- reversed?: boolean;
63
- behavior?: ScrollBehavior;
64
- };
65
- /** Create an observer from the document's own window, including when an SPFx part is rendered in an iframe. */
66
- export declare function createResizeObserverFromDocument(targetDocument: Document | null | undefined, callback: ResizeObserverCallback): ResizeObserver | null;
67
- /** Mirror a four-sided LTR observer margin for an RTL root. */
68
- export declare function getRTLRootMargin(ltrRootMargin: string, target?: Element | Document | null, win?: Window | null): string;
69
- /** Observe a changing element list with native IntersectionObserver and direction-aware margins. */
70
- export declare function useIntersectionObserver(callback: IntersectionObserverCallback, options?: IntersectionObserverInit): {
71
- setObserverList: React.Dispatch<React.SetStateAction<Element[] | undefined>>;
72
- setObserverInit: (next: IntersectionObserverInit | undefined) => void;
73
- observer: React.MutableRefObject<IntersectionObserver | undefined>;
74
- };
75
- /** Attach a resize observer callback ref; it is safe when ResizeObserver is unavailable. */
76
- export declare function useResizeObserverRef_unstable(resizeCallback: ResizeCallbackWithRef): (instance: HTMLElement | null) => void;
77
- /** Scroll an element to a fixed-size virtual item. */
78
- export declare function scrollToItemStatic({ index, itemSize, totalItems, scrollViewRef, axis, reversed, behavior }: ScrollToItemStaticParams): void;
79
- /** Scroll an element to a measured item; summing the prefix is O(index), so keep the measured list modest. */
80
- export declare function scrollToItemDynamic({ index, itemSizes, totalSize, scrollViewRef, axis, reversed, behavior }: ScrollToItemDynamicParams): void;
@@ -1,253 +0,0 @@
1
- import * as React from "react";
2
- function viewportLength(element, direction) {
3
- if (element === element.ownerDocument.body)
4
- return direction === "vertical" ? element.ownerDocument.defaultView?.innerHeight ?? 0 : element.ownerDocument.defaultView?.innerWidth ?? 0;
5
- const rect = element.getBoundingClientRect();
6
- return direction === "vertical" ? rect.height : rect.width;
7
- }
8
- /** Measure a fixed-size viewport and calculate a bounded item window. */
9
- export function useStaticVirtualizerMeasure(props) {
10
- const { defaultItemSize, direction = "vertical", bufferItems: configuredBufferItems, bufferSize: configuredBufferSize } = props;
11
- const [measurement, setMeasurement] = React.useState({ virtualizerLength: 0, bufferItems: 0, bufferSize: 0 });
12
- const containerSizeRef = React.useRef(0);
13
- const elementRef = React.useRef(null);
14
- const update = React.useCallback((element = elementRef.current) => {
15
- if (!element)
16
- return;
17
- const size = Math.max(0, viewportLength(element, direction));
18
- containerSizeRef.current = size;
19
- const visible = Math.ceil(size / Math.max(1, defaultItemSize) + 1);
20
- const next = { virtualizerLength: visible + (configuredBufferItems ?? Math.max(Math.ceil(visible / 4), 1)) * 2, bufferItems: configuredBufferItems ?? Math.max(Math.ceil(visible / 4), 1), bufferSize: configuredBufferSize ?? Math.max(defaultItemSize / 2, 1) };
21
- setMeasurement(previous => previous.virtualizerLength === next.virtualizerLength && previous.bufferItems === next.bufferItems && previous.bufferSize === next.bufferSize ? previous : next);
22
- }, [direction, defaultItemSize, configuredBufferItems, configuredBufferSize]);
23
- const observerRef = useResizeObserverRef_unstable(() => update());
24
- const scrollRef = React.useCallback((element) => {
25
- elementRef.current = element;
26
- observerRef(element);
27
- if (element)
28
- update(element);
29
- }, [observerRef, update]);
30
- React.useEffect(() => {
31
- const element = elementRef.current;
32
- const win = element?.ownerDocument.defaultView;
33
- if (!element || element !== element.ownerDocument.body || !win)
34
- return;
35
- const onResize = () => update();
36
- win.addEventListener("resize", onResize, { passive: true });
37
- return () => win.removeEventListener("resize", onResize);
38
- }, [update]);
39
- return { ...measurement, scrollRef, containerSizeRef };
40
- }
41
- /** Measure only enough variable-size rows to cover the current scroll viewport. */
42
- export function useDynamicVirtualizerMeasure(props) {
43
- const { defaultItemSize, direction = "vertical", numItems, getItemSize, bufferItems: configuredBufferItems, bufferSize: configuredBufferSize, virtualizerContext } = props;
44
- const [measurement, setMeasurement] = React.useState({ virtualizerLength: 0, bufferItems: 0, bufferSize: 0 });
45
- const containerSizeRef = React.useRef(0);
46
- const elementRef = React.useRef(null);
47
- const positionRef = React.useRef(0);
48
- const update = React.useCallback((element = elementRef.current) => {
49
- if (!element)
50
- return;
51
- containerSizeRef.current = Math.max(0, viewportLength(element, direction));
52
- const bufferSize = configuredBufferSize ?? Math.max(defaultItemSize / 2, 1);
53
- const progressiveSizes = virtualizerContext.childProgressiveSizes.current;
54
- let visible = 0;
55
- let covered = 0;
56
- let start = Math.max(0, Math.min(Math.floor(virtualizerContext.contextIndex), Math.max(0, numItems - 1)));
57
- if (progressiveSizes.length >= numItems) {
58
- let low = 0;
59
- let high = numItems;
60
- while (low < high) {
61
- const middle = (low + high) >>> 1;
62
- if (progressiveSizes[middle] <= positionRef.current)
63
- low = middle + 1;
64
- else
65
- high = middle;
66
- }
67
- start = Math.min(Math.max(0, numItems - 1), low);
68
- }
69
- while (start + visible < numItems && covered < containerSizeRef.current + bufferSize * 2) {
70
- const estimated = getItemSize(start + visible);
71
- const size = Number.isFinite(estimated) && estimated > 0 ? estimated : defaultItemSize;
72
- const end = progressiveSizes[start + visible];
73
- const beginning = start + visible === 0 ? 0 : progressiveSizes[start + visible - 1];
74
- const rowStart = Number.isFinite(end) ? beginning : (start + visible) * defaultItemSize;
75
- const rowEnd = Number.isFinite(end) ? end : rowStart + size;
76
- if (rowEnd > positionRef.current) {
77
- covered += Math.max(0, Math.min(rowEnd, positionRef.current + containerSizeRef.current + bufferSize * 2) - Math.max(rowStart, positionRef.current));
78
- visible++;
79
- }
80
- else
81
- visible++;
82
- }
83
- const nextBufferItems = configuredBufferItems ?? Math.max(Math.ceil(visible / 3), 1);
84
- const next = { virtualizerLength: Math.min(numItems, visible + nextBufferItems * 2), bufferItems: nextBufferItems, bufferSize };
85
- if (virtualizerContext.contextIndex !== start)
86
- virtualizerContext.setContextIndex(start);
87
- setMeasurement(previous => previous.virtualizerLength === next.virtualizerLength && previous.bufferItems === next.bufferItems && previous.bufferSize === next.bufferSize ? previous : next);
88
- }, [direction, defaultItemSize, numItems, getItemSize, configuredBufferItems, configuredBufferSize, virtualizerContext.contextIndex, virtualizerContext.childProgressiveSizes]);
89
- const observerRef = useResizeObserverRef_unstable(() => update());
90
- const scrollRef = React.useCallback((element) => { elementRef.current = element; observerRef(element); if (element)
91
- update(element); }, [observerRef, update]);
92
- const updateScrollPosition = React.useCallback((position) => { positionRef.current = Number.isFinite(position) ? Math.max(0, position) : 0; update(); }, [update]);
93
- React.useLayoutEffect(() => { update(); }, [update]);
94
- return { ...measurement, scrollRef, containerSizeRef, updateScrollPosition };
95
- }
96
- /** Track measured widths/heights by item index for legacy dynamic virtualizer composition. */
97
- export function useMeasureList(currentIndex, _refLength, totalLength, defaultItemSize) {
98
- const widthArray = React.useRef(Array(Math.max(0, totalLength)).fill(defaultItemSize));
99
- const heightArray = React.useRef(Array(Math.max(0, totalLength)).fill(defaultItemSize));
100
- const refArray = React.useRef([]);
101
- const [sizeUpdateCount, setSizeUpdateCount] = React.useState(0);
102
- const observer = React.useRef(null);
103
- const observerDocument = React.useRef(null);
104
- const indexByElement = React.useRef(new WeakMap());
105
- React.useEffect(() => {
106
- const previousLength = widthArray.current.length;
107
- widthArray.current.length = Math.max(0, totalLength);
108
- heightArray.current.length = Math.max(0, totalLength);
109
- for (let index = previousLength; index < widthArray.current.length; index++)
110
- widthArray.current[index] = heightArray.current[index] = defaultItemSize;
111
- refArray.current.length = Math.max(0, totalLength);
112
- }, [defaultItemSize, totalLength]);
113
- React.useEffect(() => () => observer.current?.disconnect(), []);
114
- const measure = React.useCallback((element, index) => {
115
- const rect = element.getBoundingClientRect();
116
- const width = rect.width || defaultItemSize;
117
- const height = rect.height || defaultItemSize;
118
- if (widthArray.current[index] !== width || heightArray.current[index] !== height) {
119
- widthArray.current[index] = width;
120
- heightArray.current[index] = height;
121
- setSizeUpdateCount(count => count + 1);
122
- }
123
- }, [defaultItemSize]);
124
- const createIndexedRef = React.useCallback((index) => (element) => {
125
- const absoluteIndex = Math.max(0, Math.floor(currentIndex + index));
126
- const prior = refArray.current[absoluteIndex];
127
- if (prior && prior !== element)
128
- observer.current?.unobserve(prior);
129
- refArray.current[absoluteIndex] = element;
130
- if (!element)
131
- return;
132
- indexByElement.current.set(element, absoluteIndex);
133
- element.handleResize = () => measure(element, absoluteIndex);
134
- const ResizeObserverCtor = element.ownerDocument.defaultView?.ResizeObserver;
135
- if (ResizeObserverCtor && (!observer.current || observerDocument.current !== element.ownerDocument)) {
136
- observer.current?.disconnect();
137
- const nextObserver = createResizeObserverFromDocument(element.ownerDocument, entries => entries.forEach(entry => {
138
- const row = entry.target;
139
- const rowIndex = indexByElement.current.get(row);
140
- if (rowIndex !== undefined)
141
- measure(row, rowIndex);
142
- }));
143
- observer.current = nextObserver;
144
- observerDocument.current = element.ownerDocument;
145
- }
146
- observer.current?.observe(element);
147
- measure(element, absoluteIndex);
148
- }, [currentIndex, measure]);
149
- return { widthArray, heightArray, createIndexedRef, refArray, sizeUpdateCount };
150
- }
151
- /** Create an observer from the document's own window, including when an SPFx part is rendered in an iframe. */
152
- export function createResizeObserverFromDocument(targetDocument, callback) {
153
- const Observer = targetDocument?.defaultView?.ResizeObserver;
154
- return Observer ? new Observer(callback) : null;
155
- }
156
- /** Mirror a four-sided LTR observer margin for an RTL root. */
157
- export function getRTLRootMargin(ltrRootMargin, target, win) {
158
- const element = target?.nodeType === 9 ? target.documentElement : target;
159
- if (!element || !win || win.getComputedStyle(element).direction !== "rtl")
160
- return ltrRootMargin;
161
- const margins = ltrRootMargin.trim().split(/\s+/);
162
- return margins.length === 4 ? `${margins[0]} ${margins[3]} ${margins[2]} ${margins[1]}` : ltrRootMargin;
163
- }
164
- /** Observe a changing element list with native IntersectionObserver and direction-aware margins. */
165
- export function useIntersectionObserver(callback, options) {
166
- const [elements, setElements] = React.useState();
167
- const [init, setInit] = React.useState(options);
168
- const observer = React.useRef(undefined);
169
- const callbackRef = React.useRef(callback);
170
- const [directionRevision, setDirectionRevision] = React.useState(0);
171
- callbackRef.current = callback;
172
- const setObserverInit = React.useCallback((next) => setInit(next), []);
173
- React.useEffect(() => {
174
- const root = init?.root;
175
- const doc = root?.ownerDocument ?? (typeof document === "undefined" ? undefined : document);
176
- const MutationObserverCtor = doc?.defaultView?.MutationObserver;
177
- if (!MutationObserverCtor || !root)
178
- return;
179
- const mutationObserver = new MutationObserverCtor(records => {
180
- if (records.some(record => record.attributeName === "dir"))
181
- setDirectionRevision(revision => revision + 1);
182
- });
183
- mutationObserver.observe(doc.documentElement, { attributes: true, subtree: true, attributeFilter: ["dir"] });
184
- return () => mutationObserver.disconnect();
185
- }, [init?.root]);
186
- React.useEffect(() => {
187
- const root = init?.root;
188
- const doc = (root?.nodeType === 1 ? root.ownerDocument : typeof document === "undefined" ? undefined : document);
189
- const win = doc?.defaultView;
190
- if (!win?.IntersectionObserver)
191
- return;
192
- const rootMargin = getRTLRootMargin(init?.rootMargin ?? "0px", init?.root, win);
193
- const instance = new win.IntersectionObserver((entries, current) => callbackRef.current(entries, current), { ...init, rootMargin });
194
- observer.current = instance;
195
- elements?.forEach(element => instance.observe(element));
196
- return () => {
197
- instance.disconnect();
198
- if (observer.current === instance)
199
- observer.current = undefined;
200
- };
201
- }, [elements, init, directionRevision]);
202
- return { setObserverList: setElements, setObserverInit, observer };
203
- }
204
- /** Attach a resize observer callback ref; it is safe when ResizeObserver is unavailable. */
205
- export function useResizeObserverRef_unstable(resizeCallback) {
206
- const callbackRef = React.useRef(resizeCallback);
207
- callbackRef.current = resizeCallback;
208
- const observed = React.useRef(null);
209
- React.useEffect(() => () => { observed.current?.observer.disconnect(); observed.current = null; }, []);
210
- return React.useCallback(instance => {
211
- const current = observed.current;
212
- if (current?.element === instance)
213
- return;
214
- current?.observer.disconnect();
215
- observed.current = null;
216
- const Observer = instance?.ownerDocument.defaultView?.ResizeObserver;
217
- if (!instance || !Observer)
218
- return;
219
- const target = { current: instance };
220
- const observer = new Observer((entries, currentObserver) => callbackRef.current(entries, currentObserver, target));
221
- observed.current = { element: instance, observer };
222
- observer.observe(instance);
223
- }, []);
224
- }
225
- /** Scroll an element to a fixed-size virtual item. */
226
- export function scrollToItemStatic({ index, itemSize, totalItems, scrollViewRef, axis = "vertical", reversed = false, behavior = "auto" }) {
227
- const view = scrollViewRef.current;
228
- if (!view || !Number.isFinite(index) || !Number.isFinite(itemSize) || itemSize <= 0 || totalItems <= 0)
229
- return;
230
- const safeIndex = Math.max(0, Math.min(totalItems - 1, Math.floor(index)));
231
- const offset = reversed ? Math.max(0, totalItems * itemSize - itemSize * (safeIndex + 1)) : safeIndex * itemSize;
232
- if (axis === "horizontal")
233
- view.scrollTo({ left: offset, behavior });
234
- else
235
- view.scrollTo({ top: offset, behavior });
236
- }
237
- /** Scroll an element to a measured item; summing the prefix is O(index), so keep the measured list modest. */
238
- export function scrollToItemDynamic({ index, itemSizes, totalSize, scrollViewRef, axis = "vertical", reversed = false, behavior = "auto" }) {
239
- const view = scrollViewRef.current;
240
- const sizes = itemSizes.current;
241
- if (!view || !sizes || !Number.isFinite(index) || !sizes.length)
242
- return;
243
- const safeIndex = Math.max(0, Math.min(sizes.length - 1, Math.floor(index)));
244
- let offset = 0;
245
- for (let item = 0; item < safeIndex; item++)
246
- offset += Number.isFinite(sizes[item]) ? Math.max(0, sizes[item]) : 0;
247
- if (reversed)
248
- offset = Math.max(0, totalSize - offset - (Number.isFinite(sizes[safeIndex]) ? Math.max(0, sizes[safeIndex]) : 0));
249
- if (axis === "horizontal")
250
- view.scrollTo({ left: offset, behavior });
251
- else
252
- view.scrollTo({ top: offset, behavior });
253
- }
@@ -1,43 +0,0 @@
1
- import { readdir, readFile, writeFile } from "node:fs/promises";
2
- import { fileURLToPath } from "node:url";
3
- import { dirname, resolve } from "node:path";
4
-
5
- const packageDir = resolve(dirname(fileURLToPath(import.meta.url)), "..");
6
- const sourceDir = resolve(packageDir, "src");
7
- const outputPath = resolve(packageDir, "tokens.json");
8
- const checkOnly = process.argv.includes("--check");
9
- const components = new Map();
10
- const declarations = new Map();
11
- const addTokens = (map, source, text) => {
12
- for (const token of text.match(/--spui-[\w-]+/g) ?? []) {
13
- if (token === "--spui-palette-") continue;
14
- const sources = map.get(token) ?? new Set();
15
- sources.add(source);
16
- map.set(token, sources);
17
- }
18
- };
19
-
20
- for (const file of (await readdir(resolve(sourceDir, "elements"))).filter(name => name.endsWith(".ts")).sort()) {
21
- addTokens(components, file.slice(0, -3), await readFile(resolve(sourceDir, "elements", file), "utf8"));
22
- }
23
- for (const file of ["appearance.ts", "theme.ts"]) {
24
- addTokens(declarations, file.slice(0, -3), await readFile(resolve(sourceDir, file), "utf8"));
25
- }
26
-
27
- const tokens = [...new Set([...components.keys(), ...declarations.keys()])].sort().map(name => ({
28
- name,
29
- components: [...(components.get(name) ?? [])].sort(),
30
- declaredBy: [...(declarations.get(name) ?? [])].sort()
31
- }));
32
- const dynamicPrefixes = [{ prefix: "--spui-palette-", declaredBy: ["theme"] }];
33
- const content = `${JSON.stringify({ generatedFrom: "src/elements/*.ts, src/appearance.ts, src/theme.ts", dynamicPrefixes, tokens }, null, 2)}\n`;
34
- if (checkOnly) {
35
- const current = await readFile(outputPath, "utf8").catch(() => "");
36
- if (current !== content) {
37
- console.error("Token index is stale. Run npm run tokens:generate --workspace @spfx-fast/sharepoint-ui.");
38
- process.exitCode = 1;
39
- } else console.log(`Token index is current (${tokens.length} tokens).`);
40
- } else {
41
- await writeFile(outputPath, content);
42
- console.log(`Wrote ${tokens.length} component token entries to ${outputPath}.`);
43
- }
@@ -1,55 +0,0 @@
1
- import { readFile, writeFile } from "node:fs/promises";
2
- import { dirname, resolve } from "node:path";
3
- import { fileURLToPath } from "node:url";
4
- import ts from "typescript";
5
-
6
- const pkgDir = resolve(dirname(fileURLToPath(import.meta.url)), "..");
7
- const catalogPath = resolve(pkgDir, "components.json");
8
- const adapterPath = resolve(pkgDir, "src/react.tsx");
9
- const catalog = JSON.parse(await readFile(catalogPath, "utf8"));
10
- const adapterText = await readFile(adapterPath, "utf8");
11
- const source = ts.createSourceFile(adapterPath, adapterText, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
12
- const components = new Map();
13
-
14
- function collect(node) {
15
- if (ts.isFunctionDeclaration(node) && node.name && node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.ExportKeyword)) {
16
- components.set(node.name.text, node);
17
- }
18
- if (ts.isVariableStatement(node) && node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.ExportKeyword)) {
19
- for (const declaration of node.declarationList.declarations) {
20
- if (!ts.isIdentifier(declaration.name) || !declaration.initializer) continue;
21
- function findNamedFunction(candidate) {
22
- if (ts.isFunctionExpression(candidate) && candidate.name?.text === declaration.name.text) return candidate;
23
- let found;
24
- ts.forEachChild(candidate, child => { found ??= findNamedFunction(child); });
25
- return found;
26
- }
27
- const component = findNamedFunction(declaration.initializer);
28
- if (component) components.set(declaration.name.text, component);
29
- }
30
- }
31
- ts.forEachChild(node, collect);
32
- }
33
-
34
- collect(source);
35
- const changed = [];
36
- for (const entry of catalog.components) {
37
- const component = components.get(entry.react);
38
- const parameter = component?.parameters[0];
39
- if (!parameter) throw new Error(`Cannot find first React parameter for ${entry.react}`);
40
- const signature = parameter.getText(source);
41
- if (entry.api.reactSignature !== signature) {
42
- changed.push(entry.react);
43
- entry.api.reactSignature = signature;
44
- }
45
- }
46
-
47
- if (process.argv.includes("--check")) {
48
- if (changed.length) {
49
- console.error(`Catalog React signatures are stale: ${changed.join(", ")}`);
50
- process.exitCode = 1;
51
- } else console.log(`React signatures match all ${catalog.components.length} adapters.`);
52
- } else if (changed.length) {
53
- await writeFile(catalogPath, `${JSON.stringify(catalog, null, 2)}\n`);
54
- console.log(`Updated ${changed.length} React signatures: ${changed.join(", ")}`);
55
- } else console.log(`React signatures already match all ${catalog.components.length} adapters.`);