@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.
- package/QUICKSTART.md +18 -0
- package/README.md +19 -24
- package/components.json +240 -5694
- package/dist/accordion.d.ts +11 -0
- package/dist/accordion.js +4 -0
- package/dist/alert.d.ts +3 -0
- package/dist/alert.js +4 -0
- package/dist/attachment-list.d.ts +15 -0
- package/dist/attachment-list.js +14 -0
- package/dist/avatar-group.d.ts +12 -0
- package/dist/avatar-group.js +7 -0
- package/dist/avatar.d.ts +6 -0
- package/dist/avatar.js +5 -0
- package/dist/badge.d.ts +3 -0
- package/dist/badge.js +4 -0
- package/dist/breadcrumb.d.ts +10 -0
- package/dist/breadcrumb.js +9 -0
- package/dist/button-group.d.ts +6 -0
- package/dist/button-group.js +4 -0
- package/dist/button.d.ts +3 -0
- package/dist/button.js +4 -0
- package/dist/card.d.ts +3 -0
- package/dist/card.js +4 -0
- package/dist/carousel.d.ts +11 -0
- package/dist/carousel.js +6 -0
- package/dist/checkbox.d.ts +3 -0
- package/dist/checkbox.js +4 -0
- package/dist/combobox.d.ts +9 -0
- package/dist/combobox.js +6 -0
- package/dist/command-bar.d.ts +6 -0
- package/dist/command-bar.js +4 -0
- package/dist/copy-button.d.ts +7 -0
- package/dist/copy-button.js +19 -0
- package/dist/data-grid.d.ts +25 -0
- package/dist/data-grid.js +39 -0
- package/dist/date-range-picker.d.ts +12 -0
- package/dist/date-range-picker.js +4 -0
- package/dist/dialog.d.ts +9 -0
- package/dist/dialog.js +21 -0
- package/dist/divider.d.ts +3 -0
- package/dist/divider.js +4 -0
- package/dist/drawer.d.ts +6 -0
- package/dist/drawer.js +5 -0
- package/dist/empty-state.d.ts +7 -0
- package/dist/empty-state.js +5 -0
- package/dist/field.d.ts +15 -0
- package/dist/field.js +11 -0
- package/dist/file-dropzone.d.ts +15 -0
- package/dist/file-dropzone.js +21 -0
- package/dist/filter-bar.d.ts +9 -0
- package/dist/filter-bar.js +9 -0
- package/dist/image.d.ts +5 -0
- package/dist/image.js +4 -0
- package/dist/index.d.ts +68 -76
- package/dist/index.js +60 -66
- package/dist/input.d.ts +3 -0
- package/dist/input.js +4 -0
- package/dist/label.d.ts +3 -0
- package/dist/label.js +4 -0
- package/dist/link.d.ts +3 -0
- package/dist/link.js +9 -0
- package/dist/list-view.d.ts +29 -0
- package/dist/list-view.js +14 -0
- package/dist/list.d.ts +6 -0
- package/dist/list.js +5 -0
- package/dist/lookup-picker.d.ts +12 -0
- package/dist/lookup-picker.js +4 -0
- package/dist/menu.d.ts +6 -0
- package/dist/menu.js +4 -0
- package/dist/nav.d.ts +12 -0
- package/dist/nav.js +4 -0
- package/dist/pagination.d.ts +11 -0
- package/dist/pagination.js +5 -0
- package/dist/person-picker.d.ts +13 -0
- package/dist/person-picker.js +4 -0
- package/dist/persona.d.ts +7 -0
- package/dist/persona.js +5 -0
- package/dist/popover.d.ts +6 -0
- package/dist/popover.js +4 -0
- package/dist/progress-bar.d.ts +5 -0
- package/dist/progress-bar.js +5 -0
- package/dist/radio-group.d.ts +6 -0
- package/dist/radio-group.js +4 -0
- package/dist/radio.d.ts +3 -0
- package/dist/radio.js +4 -0
- package/dist/rating.d.ts +8 -0
- package/dist/rating.js +5 -0
- package/dist/react.d.ts +1 -4583
- package/dist/react.js +1 -6837
- package/dist/select.d.ts +3 -0
- package/dist/select.js +4 -0
- package/dist/sharepoint-field.d.ts +18 -0
- package/dist/sharepoint-field.js +54 -0
- package/dist/skeleton.d.ts +6 -0
- package/dist/skeleton.js +9 -0
- package/dist/spinner.d.ts +5 -0
- package/dist/spinner.js +4 -0
- package/dist/swatch-picker.d.ts +17 -0
- package/dist/swatch-picker.js +11 -0
- package/dist/switch.d.ts +3 -0
- package/dist/switch.js +4 -0
- package/dist/table.d.ts +6 -0
- package/dist/table.js +4 -0
- package/dist/tabs.d.ts +14 -0
- package/dist/tabs.js +30 -0
- package/dist/tag-group.d.ts +6 -0
- package/dist/tag-group.js +4 -0
- package/dist/tag-picker.d.ts +12 -0
- package/dist/tag-picker.js +4 -0
- package/dist/tag.d.ts +7 -0
- package/dist/tag.js +5 -0
- package/dist/text.d.ts +5 -0
- package/dist/text.js +4 -0
- package/dist/textarea.d.ts +3 -0
- package/dist/textarea.js +4 -0
- package/dist/theme.d.ts +15 -167
- package/dist/theme.js +36 -162
- package/dist/toast.d.ts +9 -0
- package/dist/toast.js +12 -0
- package/dist/tree.d.ts +13 -0
- package/dist/tree.js +9 -0
- package/dist/view-card.d.ts +8 -0
- package/dist/view-card.js +4 -0
- package/dist/view-switcher.d.ts +13 -0
- package/dist/view-switcher.js +7 -0
- package/dist/virtual-list.d.ts +11 -0
- package/dist/virtual-list.js +25 -0
- package/measurements.json +365 -0
- package/package.json +19 -42
- package/src/theme.css +125 -0
- package/AGENTS.md +0 -211
- package/dist/appearance.d.ts +0 -6
- package/dist/appearance.js +0 -217
- package/dist/elements/accordion.d.ts +0 -9
- package/dist/elements/accordion.js +0 -338
- package/dist/elements/alert.d.ts +0 -2
- package/dist/elements/alert.js +0 -62
- package/dist/elements/avatar-group-primitives.d.ts +0 -3
- package/dist/elements/avatar-group-primitives.js +0 -189
- package/dist/elements/avatar-group.d.ts +0 -2
- package/dist/elements/avatar-group.js +0 -110
- package/dist/elements/avatar.d.ts +0 -4
- package/dist/elements/avatar.js +0 -251
- package/dist/elements/badge.d.ts +0 -8
- package/dist/elements/badge.js +0 -182
- package/dist/elements/breadcrumb.d.ts +0 -4
- package/dist/elements/breadcrumb.js +0 -233
- package/dist/elements/button-group.d.ts +0 -1
- package/dist/elements/button-group.js +0 -20
- package/dist/elements/button-variants.d.ts +0 -6
- package/dist/elements/button-variants.js +0 -339
- package/dist/elements/button.d.ts +0 -5
- package/dist/elements/button.js +0 -233
- package/dist/elements/card-primitives.d.ts +0 -3
- package/dist/elements/card-primitives.js +0 -83
- package/dist/elements/card.d.ts +0 -5
- package/dist/elements/card.js +0 -213
- package/dist/elements/carousel.d.ts +0 -92
- package/dist/elements/carousel.js +0 -1112
- package/dist/elements/color-picker.d.ts +0 -24
- package/dist/elements/color-picker.js +0 -1004
- package/dist/elements/combobox.d.ts +0 -1
- package/dist/elements/combobox.js +0 -1012
- package/dist/elements/data-grid-model.d.ts +0 -117
- package/dist/elements/data-grid-model.js +0 -294
- package/dist/elements/data-grid.d.ts +0 -29
- package/dist/elements/data-grid.js +0 -1567
- package/dist/elements/date-picker.d.ts +0 -1
- package/dist/elements/date-picker.js +0 -486
- package/dist/elements/dialog.d.ts +0 -23
- package/dist/elements/dialog.js +0 -409
- package/dist/elements/divider.d.ts +0 -2
- package/dist/elements/divider.js +0 -66
- package/dist/elements/drawer.d.ts +0 -3
- package/dist/elements/drawer.js +0 -308
- package/dist/elements/field-composition.d.ts +0 -26
- package/dist/elements/field-composition.js +0 -133
- package/dist/elements/field.d.ts +0 -1
- package/dist/elements/field.js +0 -67
- package/dist/elements/file-upload.d.ts +0 -6
- package/dist/elements/file-upload.js +0 -211
- package/dist/elements/floating-position.d.ts +0 -26
- package/dist/elements/floating-position.js +0 -39
- package/dist/elements/image.d.ts +0 -28
- package/dist/elements/image.js +0 -38
- package/dist/elements/info.d.ts +0 -9
- package/dist/elements/info.js +0 -102
- package/dist/elements/input.d.ts +0 -5
- package/dist/elements/input.js +0 -255
- package/dist/elements/label.d.ts +0 -15
- package/dist/elements/label.js +0 -56
- package/dist/elements/link.d.ts +0 -1
- package/dist/elements/link.js +0 -92
- package/dist/elements/list.d.ts +0 -19
- package/dist/elements/list.js +0 -297
- package/dist/elements/menu.d.ts +0 -33
- package/dist/elements/menu.js +0 -1103
- package/dist/elements/message-bar.d.ts +0 -10
- package/dist/elements/message-bar.js +0 -299
- package/dist/elements/nav.d.ts +0 -32
- package/dist/elements/nav.js +0 -791
- package/dist/elements/overflow.d.ts +0 -9
- package/dist/elements/overflow.js +0 -218
- package/dist/elements/persona.d.ts +0 -3
- package/dist/elements/persona.js +0 -125
- package/dist/elements/popover.d.ts +0 -77
- package/dist/elements/popover.js +0 -840
- package/dist/elements/progress-bar.d.ts +0 -4
- package/dist/elements/progress-bar.js +0 -82
- package/dist/elements/radio-group.d.ts +0 -1
- package/dist/elements/radio-group.js +0 -303
- package/dist/elements/rating-display.d.ts +0 -2
- package/dist/elements/rating-display.js +0 -125
- package/dist/elements/rating.d.ts +0 -2
- package/dist/elements/rating.js +0 -206
- package/dist/elements/rich-text-editor.d.ts +0 -18
- package/dist/elements/rich-text-editor.js +0 -508
- package/dist/elements/search.d.ts +0 -3
- package/dist/elements/search.js +0 -207
- package/dist/elements/select.d.ts +0 -6
- package/dist/elements/select.js +0 -291
- package/dist/elements/shared.d.ts +0 -19
- package/dist/elements/shared.js +0 -396
- package/dist/elements/skeleton.d.ts +0 -6
- package/dist/elements/skeleton.js +0 -91
- package/dist/elements/slider.d.ts +0 -1
- package/dist/elements/slider.js +0 -248
- package/dist/elements/spin-button.d.ts +0 -7
- package/dist/elements/spin-button.js +0 -499
- package/dist/elements/spinner.d.ts +0 -4
- package/dist/elements/spinner.js +0 -124
- package/dist/elements/swatch-picker.d.ts +0 -5
- package/dist/elements/swatch-picker.js +0 -363
- package/dist/elements/table.d.ts +0 -21
- package/dist/elements/table.js +0 -261
- package/dist/elements/tabs.d.ts +0 -1
- package/dist/elements/tabs.js +0 -276
- package/dist/elements/tag-picker.d.ts +0 -29
- package/dist/elements/tag-picker.js +0 -697
- package/dist/elements/tags.d.ts +0 -21
- package/dist/elements/tags.js +0 -421
- package/dist/elements/teaching-popover.d.ts +0 -32
- package/dist/elements/teaching-popover.js +0 -412
- package/dist/elements/text.d.ts +0 -9
- package/dist/elements/text.js +0 -75
- package/dist/elements/textarea.d.ts +0 -1
- package/dist/elements/textarea.js +0 -182
- package/dist/elements/toast.d.ts +0 -25
- package/dist/elements/toast.js +0 -337
- package/dist/elements/toaster.d.ts +0 -6
- package/dist/elements/toaster.js +0 -356
- package/dist/elements/toggle.d.ts +0 -2
- package/dist/elements/toggle.js +0 -246
- package/dist/elements/toolbar.d.ts +0 -12
- package/dist/elements/toolbar.js +0 -381
- package/dist/elements/tooltip.d.ts +0 -76
- package/dist/elements/tooltip.js +0 -510
- package/dist/elements/tree-model.d.ts +0 -19
- package/dist/elements/tree-model.js +0 -34
- package/dist/elements/tree.d.ts +0 -5
- package/dist/elements/tree.js +0 -273
- package/dist/elements/view-card.d.ts +0 -2
- package/dist/elements/view-card.js +0 -78
- package/dist/elements/virtual-list.d.ts +0 -41
- package/dist/elements/virtual-list.js +0 -369
- package/dist/elements.d.ts +0 -72
- package/dist/elements.js +0 -207
- package/dist/virtualizer-hooks.d.ts +0 -80
- package/dist/virtualizer-hooks.js +0 -253
- package/scripts/generate-token-index.mjs +0 -43
- package/scripts/sync-component-catalog-signatures.mjs +0 -55
- package/scripts/validate-component-catalog.mjs +0 -44
- package/skills/sharepoint-ui/SKILL.md +0 -12
- package/skills/sharepoint-ui/references/choosing-components.md +0 -20
- package/skills/sharepoint-ui/references/sharepoint-patterns.md +0 -17
- package/tokens.json +0 -3777
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { access, readFile } from "node:fs/promises";
|
|
2
|
-
import { fileURLToPath } from "node:url";
|
|
3
|
-
import { dirname, resolve } from "node:path";
|
|
4
|
-
|
|
5
|
-
const pkgDir = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
6
|
-
const catalog = JSON.parse(await readFile(resolve(pkgDir, "components.json"), "utf8"));
|
|
7
|
-
const built = await access(resolve(pkgDir, "src/react.tsx")).then(() => false).catch(() => true);
|
|
8
|
-
const sourceDir = resolve(pkgDir, built ? "dist" : "src");
|
|
9
|
-
const adapter = await readFile(resolve(sourceDir, built ? "react.d.ts" : "react.tsx"), "utf8");
|
|
10
|
-
const barrel = await readFile(resolve(sourceDir, built ? "index.d.ts" : "index.ts"), "utf8");
|
|
11
|
-
const errors = [];
|
|
12
|
-
|
|
13
|
-
for (const component of catalog.components) {
|
|
14
|
-
if (typeof component.summary !== "string" || !component.summary.trim()) errors.push(`${component.react}: missing human-readable component summary`);
|
|
15
|
-
if (!component.api?.reactSignature || !Array.isArray(component.api.slots) || !Array.isArray(component.api.callbackProps)) errors.push(`${component.react}: missing agent API signature, slots, or callback props`);
|
|
16
|
-
const exportName = component.define ?? component.factory;
|
|
17
|
-
if (!component.reactOnly && !exportName) errors.push(`${component.react}: missing custom-element definition or native-element factory`);
|
|
18
|
-
const signature = component.api.reactRefType
|
|
19
|
-
? (() => {
|
|
20
|
-
const declaration = new RegExp(`export const ${component.react} = (?:/\\* @__PURE__ \\*/ )?React\\.forwardRef<${component.api.reactRefType},`);
|
|
21
|
-
const declarationIndex = adapter.search(declaration);
|
|
22
|
-
const generic = component.api.generic ? `<${component.api.generic}>` : "";
|
|
23
|
-
const forwardedRef = component.api.forwardRefParameterType ? `forwardedRef: ${component.api.forwardRefParameterType}` : "forwardedRef";
|
|
24
|
-
const functionSignature = `function ${component.react}${generic}(${component.api.reactSignature}, ${forwardedRef})`;
|
|
25
|
-
return declarationIndex >= 0 && adapter.indexOf(functionSignature, declarationIndex) >= declarationIndex;
|
|
26
|
-
})()
|
|
27
|
-
: adapter.includes(`export function ${component.react}${component.api.generic ? `<${component.api.generic}>` : ""}(${component.api.reactSignature})`);
|
|
28
|
-
if (!signature) errors.push(`${component.react}: catalog API signature is stale`);
|
|
29
|
-
if (!new RegExp(`\\b${component.react}\\b`).test(adapter)) errors.push(`${component.react}: missing React adapter export`);
|
|
30
|
-
for (const helper of component.api.reactHelpers ?? []) {
|
|
31
|
-
if (!new RegExp(`\\bexport\\s+(?:const|function|type|interface)\\s+${helper}\\b`).test(adapter)) errors.push(`${component.react}: missing catalogued React helper ${helper}`);
|
|
32
|
-
}
|
|
33
|
-
if (component.reactOnly) continue;
|
|
34
|
-
const source = await readFile(resolve(sourceDir, `elements/${component.module}.${built ? "js" : "ts"}`), "utf8").catch(() => null);
|
|
35
|
-
if (!source) { errors.push(`${component.tag}: missing source module ${component.module}`); continue; }
|
|
36
|
-
const literalRegistration = new RegExp(`customElements\\.define\\(["']${component.tag}["']`).test(source);
|
|
37
|
-
const sharedFactoryRegistration = source.includes(`"${component.tag}"`) && /customElements\.define\(tag,/.test(source);
|
|
38
|
-
const partRegistration = component.tag.startsWith("spui-teaching-popover-") && source.includes(`partTag("${component.tag.slice("spui-teaching-popover-".length)}")`) && /function definePart\(/.test(source) && /customElements\.define\(tag,/.test(source);
|
|
39
|
-
if (component.registered !== false && !literalRegistration && !sharedFactoryRegistration && !partRegistration && !(source.includes(`"${component.tag}"`) && /customElements\.define\(name/.test(source))) errors.push(`${component.tag}: missing custom-element definition`);
|
|
40
|
-
if (exportName && !new RegExp(`\\b${exportName}\\b`).test(barrel)) errors.push(`${exportName}: missing public element/factory export`);
|
|
41
|
-
}
|
|
42
|
-
if (!catalog.frameworkCompatibility?.spfx || catalog.components.length === 0) errors.push("Catalog requires SPFx compatibility and components.");
|
|
43
|
-
if (errors.length) { console.error(`Catalog check failed:\n- ${errors.join("\n- ")}`); process.exitCode = 1; }
|
|
44
|
-
else console.log(`Validated ${catalog.components.length} component entries against React adapters and custom-element exports.`);
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sharepoint-ui
|
|
3
|
-
description: Build or change accessible, theme-aware SharePoint Framework interfaces with @spfx-fast/sharepoint-ui. Use when an SPFx web part needs reusable controls, SharePoint-style cards, tokens, RTL, custom elements, or rich text saved through SharePoint.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# SharePoint UI component skill
|
|
7
|
-
|
|
8
|
-
Use the package manifest at `../../components.json` to find exact React names, custom-element tags, and leaf entry points. The source repository checks it with `npm run catalog:check --workspace @spfx-fast/sharepoint-ui`. Use the package's TypeScript declarations as the final API authority. Do not infer that an unlisted Fluent v9 component exists; the library is still growing toward parity.
|
|
9
|
-
|
|
10
|
-
For a fast composition guide, read [choosing components](references/choosing-components.md). For theme, locale, RTL, forms, and persistence rules, read [SharePoint patterns](references/sharepoint-patterns.md).
|
|
11
|
-
|
|
12
|
-
Prefer leaf imports. Keep SharePoint permissions, data fetching, and writes in an SPFx service. Controls emit state; they do not save records implicitly. Validate keyboard use, theme contrast on the target surface, and RTL when relevant.
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# Choosing components
|
|
2
|
-
|
|
3
|
-
- Actions: `Button`.
|
|
4
|
-
- People and entities: `Avatar` with a name and optional image; use theme-derived `color="colorful"` for stable initials colors.
|
|
5
|
-
- Repeated SharePoint records: `ViewCard` for document, person, task, approval, or list-item content; compose details through slots.
|
|
6
|
-
- Filter and selected-value chips: use `Tag` inside a labelled `TagGroup`; set `dismissible` and update the backing array in `onDismiss`.
|
|
7
|
-
- Searchable multi-select values: use `TagPicker` with `TagPickerOption` children, stable values, and a controlled `selectedValues` array.
|
|
8
|
-
- User-provided scores: use `Rating` with a visible label and controlled `value`; set `step={0.5}` when half-star scores are useful.
|
|
9
|
-
- Short text and multiline text: `TextField` and `TextArea`.
|
|
10
|
-
- Typography and semantic labels: `Text` for heading/body/emphasis styles, and `Label` for form-control labels. Non-React code can use `spui-text` with `defineText()`; use the `createLabel()` factory when native `for` association is needed.
|
|
11
|
-
- Fixed choices: `Select` or `RadioGroup`.
|
|
12
|
-
- Searchable choices: `ComboBox` and `ComboOption`.
|
|
13
|
-
- Numeric/date/range values: `SpinButton`, `DatePicker`, and `Slider`.
|
|
14
|
-
- Rich formatted notes: `RichTextEditor`; it is a lightweight SharePoint-oriented editor, not a collaborative document surface.
|
|
15
|
-
- Navigation and disclosure: `Link` for URLs, `Divider` to separate content groups, and `Accordion` with `AccordionItem` for progressive disclosure. Prefer an explicit link name and preserve native anchor behavior.
|
|
16
|
-
- Persistent feedback: `Alert` for live status/urgent information; `MessageBar` for page-level notices. Use `Skeleton` for loading placeholders, and `Badge`, `Spinner`, or `ProgressBar` for compact status/progress.
|
|
17
|
-
- Brief feedback: mount one `Toaster` near the app root and call `dispatchToast` from `useToastController()`. Use persistent `Alert`/`MessageBar` content as well when the user must be able to return to the information later.
|
|
18
|
-
- Confirmation: `Dialog`.
|
|
19
|
-
|
|
20
|
-
Import React adapters from `@spfx-fast/sharepoint-ui/react`. For non-React use, import the matching leaf module, call its `define*()` function once, and use the tag from `components.json`; `Label` is the exception because its factory returns a native `<label>`. Check the source catalog before substituting a native element for a missing library family.
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# SharePoint patterns
|
|
2
|
-
|
|
3
|
-
## Theme and layout
|
|
4
|
-
|
|
5
|
-
Wrap a React surface in `SharePointUIProvider` and pass the SharePoint `ThemeProvider` values through `applySharePointTheme()` at the web-part boundary. Set `lang` and `dir` on the provider. Use tokens and CSS parts to customize; avoid copying a component's internal markup. Glass derives its values from the selected SharePoint/base appearance.
|
|
6
|
-
|
|
7
|
-
## Forms and events
|
|
8
|
-
|
|
9
|
-
Give every field a visible label. Use controlled values when the surrounding form owns state and wire the component's `onValueChange`/`onCheckedChange` callback. Native form behavior is used where possible; custom elements use `ElementInternals` where supported. Verify browser form reset and disabled behavior for the exact field before depending on it.
|
|
10
|
-
|
|
11
|
-
## SharePoint persistence
|
|
12
|
-
|
|
13
|
-
Use SPFx `SPHttpClient` or the project's existing data service for SharePoint requests. Show loading, success, and error states. Read important writes back and compare the saved result. `RichTextEditor` returns allowlist-normalized HTML; never render arbitrary saved HTML with unsanitized `innerHTML`.
|
|
14
|
-
|
|
15
|
-
## Agent handoff
|
|
16
|
-
|
|
17
|
-
State which controls were selected and why, list data fields and write locations, theme/locale assumptions, and the keyboard or tenant checks performed. Treat browser timing, host heap, and page long tasks as host-inclusive unless measured in isolation.
|