@fluentui/react-storybook-addon 0.4.0 → 0.4.1

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 (83) hide show
  1. package/CHANGELOG.md +12 -2
  2. package/dist/index.d.ts +86 -0
  3. package/lib/components/DirectionSwitch.js +26 -0
  4. package/lib/components/DirectionSwitch.js.map +1 -0
  5. package/lib/components/ReactStrictMode.js +23 -0
  6. package/lib/components/ReactStrictMode.js.map +1 -0
  7. package/lib/components/ThemePicker.js +61 -0
  8. package/lib/components/ThemePicker.js.map +1 -0
  9. package/lib/constants.js +4 -0
  10. package/lib/constants.js.map +1 -0
  11. package/lib/decorators/withAriaLive.js +18 -0
  12. package/lib/decorators/withAriaLive.js.map +1 -0
  13. package/lib/decorators/withFluentProvider.js +48 -0
  14. package/lib/decorators/withFluentProvider.js.map +1 -0
  15. package/lib/decorators/withReactStrictMode.js +16 -0
  16. package/lib/decorators/withReactStrictMode.js.map +1 -0
  17. package/lib/docs/DirSwitch.js +51 -0
  18. package/lib/docs/DirSwitch.js.map +1 -0
  19. package/lib/docs/FluentDocsContainer.js +24 -0
  20. package/lib/docs/FluentDocsContainer.js.map +1 -0
  21. package/lib/docs/FluentDocsPage.js +296 -0
  22. package/lib/docs/FluentDocsPage.js.map +1 -0
  23. package/lib/docs/ThemePicker.js +61 -0
  24. package/lib/docs/ThemePicker.js.map +1 -0
  25. package/lib/docs/Toc.js +130 -0
  26. package/lib/docs/Toc.js.map +1 -0
  27. package/lib/docs/index.js +2 -0
  28. package/lib/docs/index.js.map +1 -0
  29. package/lib/docs/utils.js +72 -0
  30. package/lib/docs/utils.js.map +1 -0
  31. package/lib/hooks.js +16 -0
  32. package/lib/hooks.js.map +1 -0
  33. package/lib/index.js +3 -0
  34. package/lib/index.js.map +1 -0
  35. package/lib/preset/manager.js +28 -0
  36. package/lib/preset/manager.js.map +1 -0
  37. package/lib/preset/preview.js +26 -0
  38. package/lib/preset/preview.js.map +1 -0
  39. package/lib/theme.js +31 -0
  40. package/lib/theme.js.map +1 -0
  41. package/lib/utils/isDecoratorDisabled.js +6 -0
  42. package/lib/utils/isDecoratorDisabled.js.map +1 -0
  43. package/lib-commonjs/components/DirectionSwitch.js +37 -0
  44. package/lib-commonjs/components/DirectionSwitch.js.map +1 -0
  45. package/lib-commonjs/components/ReactStrictMode.js +34 -0
  46. package/lib-commonjs/components/ReactStrictMode.js.map +1 -0
  47. package/lib-commonjs/components/ThemePicker.js +72 -0
  48. package/lib-commonjs/components/ThemePicker.js.map +1 -0
  49. package/lib-commonjs/constants.js +28 -0
  50. package/lib-commonjs/constants.js.map +1 -0
  51. package/lib-commonjs/decorators/withAriaLive.js +29 -0
  52. package/lib-commonjs/decorators/withAriaLive.js.map +1 -0
  53. package/lib-commonjs/decorators/withFluentProvider.js +59 -0
  54. package/lib-commonjs/decorators/withFluentProvider.js.map +1 -0
  55. package/lib-commonjs/decorators/withReactStrictMode.js +27 -0
  56. package/lib-commonjs/decorators/withReactStrictMode.js.map +1 -0
  57. package/lib-commonjs/docs/DirSwitch.js +60 -0
  58. package/lib-commonjs/docs/DirSwitch.js.map +1 -0
  59. package/lib-commonjs/docs/FluentDocsContainer.js +33 -0
  60. package/lib-commonjs/docs/FluentDocsContainer.js.map +1 -0
  61. package/lib-commonjs/docs/FluentDocsPage.js +307 -0
  62. package/lib-commonjs/docs/FluentDocsPage.js.map +1 -0
  63. package/lib-commonjs/docs/ThemePicker.js +70 -0
  64. package/lib-commonjs/docs/ThemePicker.js.map +1 -0
  65. package/lib-commonjs/docs/Toc.js +149 -0
  66. package/lib-commonjs/docs/Toc.js.map +1 -0
  67. package/lib-commonjs/docs/index.js +20 -0
  68. package/lib-commonjs/docs/index.js.map +1 -0
  69. package/lib-commonjs/docs/utils.js +86 -0
  70. package/lib-commonjs/docs/utils.js.map +1 -0
  71. package/lib-commonjs/hooks.js +37 -0
  72. package/lib-commonjs/hooks.js.map +1 -0
  73. package/lib-commonjs/index.js +27 -0
  74. package/lib-commonjs/index.js.map +1 -0
  75. package/lib-commonjs/preset/manager.js +32 -0
  76. package/lib-commonjs/preset/manager.js.map +1 -0
  77. package/lib-commonjs/preset/preview.js +47 -0
  78. package/lib-commonjs/preset/preview.js.map +1 -0
  79. package/lib-commonjs/theme.js +49 -0
  80. package/lib-commonjs/theme.js.map +1 -0
  81. package/lib-commonjs/utils/isDecoratorDisabled.js +16 -0
  82. package/lib-commonjs/utils/isDecoratorDisabled.js.map +1 -0
  83. package/package.json +1 -1
@@ -0,0 +1,296 @@
1
+ import * as React from 'react';
2
+ import { DocsContext, ArgsTable, Title, Subtitle, Description, HeaderMdx, Primary, Stories } from '@storybook/addon-docs';
3
+ import { tokens } from '@fluentui/react-theme';
4
+ import { Link } from '@fluentui/react-link';
5
+ import { Text } from '@fluentui/react-text';
6
+ import { makeStyles } from '@griffel/react';
7
+ import { InfoFilled } from '@fluentui/react-icons';
8
+ import { DIR_ID, THEME_ID } from '../constants';
9
+ import { themes } from '../theme';
10
+ import { getDocsPageConfig } from './utils';
11
+ import { DirSwitch } from './DirSwitch';
12
+ import { ThemePicker } from './ThemePicker';
13
+ import { Toc, nameToHash } from './Toc';
14
+ const useStyles = makeStyles({
15
+ divider: {
16
+ height: '1px',
17
+ backgroundColor: '#e1dfdd',
18
+ border: '0px none',
19
+ margin: '48px 0px'
20
+ },
21
+ wrapper: {
22
+ display: 'flex',
23
+ gap: '16px'
24
+ },
25
+ toc: {
26
+ flexBasis: '200px',
27
+ flexShrink: 0,
28
+ [`@media screen and (max-width: 1000px)`]: {
29
+ display: 'none'
30
+ }
31
+ },
32
+ container: {
33
+ // without a width, this div grows wider than its parent
34
+ width: '200px',
35
+ flexGrow: 1
36
+ },
37
+ globalTogglesContainer: {
38
+ columnGap: tokens.spacingHorizontalXXXL,
39
+ display: 'flex'
40
+ },
41
+ description: {
42
+ display: 'grid',
43
+ gridTemplateColumns: '1fr min-content'
44
+ },
45
+ additionalInfoWrapper: {
46
+ display: 'flex',
47
+ flexDirection: 'column',
48
+ gap: tokens.spacingVerticalM
49
+ },
50
+ additionalInfo: {
51
+ display: 'flex',
52
+ flexDirection: 'column',
53
+ gap: tokens.spacingVerticalM,
54
+ border: `1px solid ${tokens.colorNeutralStroke1}`,
55
+ borderRadius: tokens.borderRadiusMedium,
56
+ padding: tokens.spacingHorizontalM,
57
+ margin: `0 ${tokens.spacingHorizontalM}`
58
+ },
59
+ additionalInfoIcon: {
60
+ alignSelf: 'center',
61
+ color: tokens.colorBrandForeground1,
62
+ fontSize: '24px',
63
+ marginRight: tokens.spacingHorizontalM
64
+ },
65
+ additionalInfoMessage: {
66
+ display: 'flex',
67
+ flexDirection: 'row',
68
+ alignItems: 'center',
69
+ gap: tokens.spacingVerticalXS
70
+ },
71
+ infoIcon: {
72
+ display: 'flex',
73
+ flexDirection: 'column',
74
+ gap: tokens.spacingVerticalXS,
75
+ flex: 1
76
+ }
77
+ });
78
+ const useVideoClasses = makeStyles({
79
+ container: {
80
+ display: 'flex',
81
+ flexDirection: 'column',
82
+ gap: tokens.spacingHorizontalMNudge
83
+ },
84
+ preview: {
85
+ borderRadius: tokens.borderRadiusSmall,
86
+ display: 'flex',
87
+ flexDirection: 'column',
88
+ gap: tokens.spacingHorizontalM,
89
+ padding: tokens.spacingHorizontalM,
90
+ backgroundColor: tokens.colorNeutralBackground2,
91
+ ':hover': {
92
+ backgroundColor: tokens.colorNeutralBackground2Hover
93
+ }
94
+ },
95
+ image: {
96
+ width: '200px'
97
+ }
98
+ });
99
+ const VideoPreviews = (props)=>{
100
+ const { videos } = props;
101
+ const classes = useVideoClasses();
102
+ return /*#__PURE__*/ React.createElement("div", {
103
+ className: classes.container
104
+ }, videos.map((video)=>/*#__PURE__*/ React.createElement(Link, {
105
+ className: classes.preview,
106
+ href: video.href,
107
+ target: "_blank",
108
+ key: video.href
109
+ }, /*#__PURE__*/ React.createElement("img", {
110
+ alt: `Video: ${video.preview}`,
111
+ src: video.preview,
112
+ className: classes.image
113
+ }), /*#__PURE__*/ React.createElement(Text, null, video.title))));
114
+ };
115
+ const getNativeElementsList = (elements)=>{
116
+ const elementsArr = elements === null || elements === void 0 ? void 0 : elements.map((el, idx)=>[
117
+ /*#__PURE__*/ React.createElement("code", {
118
+ key: idx
119
+ }, `<${el}>`),
120
+ idx !== elements.length - 1 ? ', ' : ' '
121
+ ]);
122
+ return /*#__PURE__*/ React.createElement(React.Fragment, null, elementsArr, elementsArr.length > 1 ? 'elements' : 'element');
123
+ };
124
+ const slotRegex = /as\?:\s*"([^"]+)"/;
125
+ /**
126
+ * NOTE: this function mutates original story argTypes including all story subcomponents if they are present
127
+ */ function withSlotEnhancer(story, options) {
128
+ var _story_argTypes_as_type, _story_argTypes_as;
129
+ const hasArgAsProp = options.nativePropsApi ? ((_story_argTypes_as = story.argTypes.as) === null || _story_argTypes_as === void 0 ? void 0 : (_story_argTypes_as_type = _story_argTypes_as.type) === null || _story_argTypes_as_type === void 0 ? void 0 : _story_argTypes_as_type.name) === 'enum' : false;
130
+ const argAsProp = hasArgAsProp ? story.argTypes.as.type.value : null;
131
+ let hasArgAsSlot = false;
132
+ const transformPropsWithSlotShorthand = (props)=>{
133
+ Object.entries(props).forEach(([key, argType])=>{
134
+ var _argType_type;
135
+ const value = argType === null || argType === void 0 ? void 0 : (_argType_type = argType.type) === null || _argType_type === void 0 ? void 0 : _argType_type.name;
136
+ // If DocGen was already transformed, skip the transformation but set hasArgAsSlot to true so that we can show the info message
137
+ if (value.includes('Slot')) {
138
+ hasArgAsSlot = true;
139
+ return;
140
+ }
141
+ // Initial Render Transformation for shorthand slot values (mutates DocGen Object reference)
142
+ if (value.includes('WithSlotShorthandValue')) {
143
+ hasArgAsSlot = true;
144
+ const match = value.match(slotRegex);
145
+ if (match) {
146
+ props[key].type.name = `Slot<\"${match[1]}\">`;
147
+ } else {
148
+ props[key].type.name = `Slot`;
149
+ }
150
+ }
151
+ });
152
+ };
153
+ const transformComponent = (component)=>{
154
+ var _component___docgenInfo;
155
+ const docGenProps = component === null || component === void 0 ? void 0 : (_component___docgenInfo = component.__docgenInfo) === null || _component___docgenInfo === void 0 ? void 0 : _component___docgenInfo.props;
156
+ if (docGenProps) {
157
+ transformPropsWithSlotShorthand(docGenProps);
158
+ }
159
+ };
160
+ const component = story.component;
161
+ const subcomponents = story.subcomponents;
162
+ if (options.slotsApi) {
163
+ transformComponent(component);
164
+ if (subcomponents) {
165
+ Object.values(subcomponents).forEach((subcomponent)=>{
166
+ transformComponent(subcomponent);
167
+ });
168
+ }
169
+ }
170
+ return {
171
+ component,
172
+ hasArgAsSlot,
173
+ hasArgAsProp,
174
+ argAsProp
175
+ };
176
+ }
177
+ const AdditionalApiDocs = ({ children })=>{
178
+ const styles = useStyles();
179
+ return /*#__PURE__*/ React.createElement("div", {
180
+ className: styles.additionalInfo
181
+ }, /*#__PURE__*/ React.createElement("div", {
182
+ className: styles.additionalInfoMessage
183
+ }, /*#__PURE__*/ React.createElement(InfoFilled, {
184
+ className: styles.additionalInfoIcon
185
+ }), /*#__PURE__*/ React.createElement("div", {
186
+ className: styles.infoIcon
187
+ }, children)));
188
+ };
189
+ const RenderArgsTable = ({ story, hideArgsTable, showSlotsApi, showNativePropsApi })=>{
190
+ const { component, hasArgAsProp, hasArgAsSlot, argAsProp } = withSlotEnhancer(story, {
191
+ slotsApi: showSlotsApi,
192
+ nativePropsApi: showNativePropsApi
193
+ });
194
+ const styles = useStyles();
195
+ return hideArgsTable ? null : /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement("div", {
196
+ className: styles.additionalInfoWrapper
197
+ }, hasArgAsProp && /*#__PURE__*/ React.createElement(AdditionalApiDocs, null, /*#__PURE__*/ React.createElement("p", null, /*#__PURE__*/ React.createElement("b", null, "Native props are supported ", /*#__PURE__*/ React.createElement("span", {
198
+ role: "presentation"
199
+ }, "🙌"), /*#__PURE__*/ React.createElement("br", null)), /*#__PURE__*/ React.createElement("span", null, "All HTML attributes native to the", getNativeElementsList(argAsProp), ", including all ", /*#__PURE__*/ React.createElement("code", null, "aria-*"), " and ", /*#__PURE__*/ React.createElement("code", null, "data-*"), ' ', "attributes, can be applied as native props on this component."))), hasArgAsSlot && /*#__PURE__*/ React.createElement(AdditionalApiDocs, null, /*#__PURE__*/ React.createElement("p", null, /*#__PURE__*/ React.createElement("b", null, "Customizing components with slots ", /*#__PURE__*/ React.createElement("span", {
200
+ role: "presentation"
201
+ }, "🙌")), /*#__PURE__*/ React.createElement("br", null), /*#__PURE__*/ React.createElement("span", null, "Slots in Fluent UI React components are designed to be modified or replaced, providing a flexible approach to customizing components. Each slot is exposed as a top-level prop and can be filled with primitive values, JSX/TSX, props objects, or render functions. This allows for more dynamic and reusable component structures, similar to slots in other frameworks.", ' ', /*#__PURE__*/ React.createElement(Link, {
202
+ href: "/?path=/docs/concepts-developer-customizing-components-with-slots--docs"
203
+ }, "Customizing components with slots", ' '))))), /*#__PURE__*/ React.createElement(ArgsTable, {
204
+ of: component
205
+ }));
206
+ };
207
+ const RenderPrimaryStory = ({ primaryStory, skipPrimaryStory })=>{
208
+ const styles = useStyles();
209
+ return skipPrimaryStory ? null : /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement("hr", {
210
+ className: styles.divider
211
+ }), /*#__PURE__*/ React.createElement(HeaderMdx, {
212
+ as: "h3",
213
+ id: nameToHash(primaryStory.name)
214
+ }, primaryStory.name), /*#__PURE__*/ React.createElement(Primary, null));
215
+ };
216
+ export const FluentDocsPage = ()=>{
217
+ var _primaryStoryContext_parameters, _primaryStoryContext_globals, _primaryStoryContext_parameters_docs, _primaryStoryContext_parameters1, _primaryStoryContext_parameters_docs1, _primaryStoryContext_parameters2, _primaryStoryContext_parameters3;
218
+ const context = React.useContext(DocsContext);
219
+ // Get the fluent docs page configuration from context
220
+ const docsPageConfig = getDocsPageConfig(context);
221
+ const stories = context.componentStories();
222
+ const primaryStory = stories[0];
223
+ const primaryStoryContext = context.getStoryContext(primaryStory);
224
+ assertStoryMetaValues(primaryStory);
225
+ var _primaryStoryContext_parameters_dir, _ref;
226
+ const dir = (_ref = (_primaryStoryContext_parameters_dir = (_primaryStoryContext_parameters = primaryStoryContext.parameters) === null || _primaryStoryContext_parameters === void 0 ? void 0 : _primaryStoryContext_parameters.dir) !== null && _primaryStoryContext_parameters_dir !== void 0 ? _primaryStoryContext_parameters_dir : (_primaryStoryContext_globals = primaryStoryContext.globals) === null || _primaryStoryContext_globals === void 0 ? void 0 : _primaryStoryContext_globals[DIR_ID]) !== null && _ref !== void 0 ? _ref : 'ltr';
227
+ const selectedTheme = themes.find((theme)=>theme.id === primaryStoryContext.globals[THEME_ID]);
228
+ const hideArgsTable = Boolean((_primaryStoryContext_parameters1 = primaryStoryContext.parameters) === null || _primaryStoryContext_parameters1 === void 0 ? void 0 : (_primaryStoryContext_parameters_docs = _primaryStoryContext_parameters1.docs) === null || _primaryStoryContext_parameters_docs === void 0 ? void 0 : _primaryStoryContext_parameters_docs.hideArgsTable);
229
+ const skipPrimaryStory = Boolean((_primaryStoryContext_parameters2 = primaryStoryContext.parameters) === null || _primaryStoryContext_parameters2 === void 0 ? void 0 : (_primaryStoryContext_parameters_docs1 = _primaryStoryContext_parameters2.docs) === null || _primaryStoryContext_parameters_docs1 === void 0 ? void 0 : _primaryStoryContext_parameters_docs1.skipPrimaryStory);
230
+ var _primaryStoryContext_parameters_videos;
231
+ const videos = (_primaryStoryContext_parameters_videos = (_primaryStoryContext_parameters3 = primaryStoryContext.parameters) === null || _primaryStoryContext_parameters3 === void 0 ? void 0 : _primaryStoryContext_parameters3.videos) !== null && _primaryStoryContext_parameters_videos !== void 0 ? _primaryStoryContext_parameters_videos : null;
232
+ const styles = useStyles();
233
+ // If docs page is disabled, return Storybook's default docs page
234
+ if (!docsPageConfig) {
235
+ return /*#__PURE__*/ React.createElement("div", {
236
+ className: "sb-unstyled"
237
+ }, /*#__PURE__*/ React.createElement(Title, null), /*#__PURE__*/ React.createElement(Subtitle, null), /*#__PURE__*/ React.createElement(Description, null), /*#__PURE__*/ React.createElement(RenderPrimaryStory, {
238
+ primaryStory: primaryStory,
239
+ skipPrimaryStory: skipPrimaryStory
240
+ }), /*#__PURE__*/ React.createElement(RenderArgsTable, {
241
+ story: primaryStory,
242
+ hideArgsTable: hideArgsTable
243
+ }), /*#__PURE__*/ React.createElement(Stories, null));
244
+ }
245
+ // Determine what to show based on configuration
246
+ const { tableOfContents: showTableOfContents, dirSwitcher: showDirSwitcher, themePicker: showThemePicker, argTable } = docsPageConfig;
247
+ // DEBUG
248
+ // console.log('FluentDocsPage', context);
249
+ // console.table(stories.map((s: StoreItem) => ({ id: s.id, kind: s.kind, name: s.name, story: s.story })));
250
+ // console.table(
251
+ // Object.values((context as any).argTypes).map(arg => ({
252
+ // name: arg.name,
253
+ // description: arg.description,
254
+ // type: arg.table?.type?.summary ?? '?',
255
+ // default: arg.table?.defaultValue?.summary ?? '-',
256
+ // })),
257
+ // );
258
+ return /*#__PURE__*/ React.createElement("div", {
259
+ className: "sb-unstyled"
260
+ }, /*#__PURE__*/ React.createElement(Title, null), /*#__PURE__*/ React.createElement("div", {
261
+ className: styles.wrapper
262
+ }, /*#__PURE__*/ React.createElement("div", {
263
+ className: styles.container
264
+ }, (showThemePicker || showDirSwitcher) && /*#__PURE__*/ React.createElement("div", {
265
+ className: styles.globalTogglesContainer
266
+ }, showThemePicker && /*#__PURE__*/ React.createElement(ThemePicker, {
267
+ selectedThemeId: selectedTheme === null || selectedTheme === void 0 ? void 0 : selectedTheme.id
268
+ }), showDirSwitcher && /*#__PURE__*/ React.createElement(DirSwitch, {
269
+ dir: dir
270
+ })), /*#__PURE__*/ React.createElement(Subtitle, null), /*#__PURE__*/ React.createElement("div", {
271
+ className: styles.description
272
+ }, /*#__PURE__*/ React.createElement(Description, null), videos && /*#__PURE__*/ React.createElement(VideoPreviews, {
273
+ videos: videos
274
+ })), /*#__PURE__*/ React.createElement(RenderPrimaryStory, {
275
+ primaryStory: primaryStory,
276
+ skipPrimaryStory: skipPrimaryStory
277
+ }), /*#__PURE__*/ React.createElement(RenderArgsTable, {
278
+ story: primaryStory,
279
+ hideArgsTable: hideArgsTable,
280
+ showSlotsApi: argTable.slotsApi,
281
+ showNativePropsApi: argTable.nativePropsApi
282
+ }), /*#__PURE__*/ React.createElement(Stories, null)), showTableOfContents && /*#__PURE__*/ React.createElement("div", {
283
+ className: styles.toc
284
+ }, /*#__PURE__*/ React.createElement(Toc, {
285
+ stories: stories
286
+ }))));
287
+ };
288
+ function assertStoryMetaValues(story) {
289
+ if (story.component === null) {
290
+ throw new Error([
291
+ '🚨 Invalid Story Meta declaration:',
292
+ `- primaryStory.component of componentId:${story.componentId} is "null"`,
293
+ '- to resolve this error, please update "component" property value in your story definition to reference a React Component or remove it if it is not needed.'
294
+ ].join('\n'));
295
+ }
296
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/docs/FluentDocsPage.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n DocsContext,\n ArgsTable,\n Title,\n Subtitle,\n Description,\n HeaderMdx,\n Primary,\n Stories,\n type DocsContextProps,\n} from '@storybook/addon-docs';\nimport type { PreparedStory, Renderer, SBEnumType } from '@storybook/types';\n\nimport { tokens } from '@fluentui/react-theme';\nimport { Link } from '@fluentui/react-link';\nimport { Text } from '@fluentui/react-text';\nimport { makeStyles } from '@griffel/react';\nimport { InfoFilled } from '@fluentui/react-icons';\n\nimport { DIR_ID, THEME_ID } from '../constants';\nimport { themes } from '../theme';\n\nimport { getDocsPageConfig } from './utils';\nimport { DirSwitch } from './DirSwitch';\nimport { ThemePicker } from './ThemePicker';\nimport { Toc, nameToHash } from './Toc';\n\ntype PrimaryStory = PreparedStory<Renderer>;\n\nconst useStyles = makeStyles({\n divider: {\n height: '1px',\n backgroundColor: '#e1dfdd',\n border: '0px none',\n margin: '48px 0px',\n },\n wrapper: {\n display: 'flex',\n gap: '16px',\n },\n toc: {\n flexBasis: '200px',\n flexShrink: 0,\n [`@media screen and (max-width: 1000px)`]: {\n display: 'none',\n },\n },\n container: {\n // without a width, this div grows wider than its parent\n width: '200px',\n flexGrow: 1,\n },\n globalTogglesContainer: {\n columnGap: tokens.spacingHorizontalXXXL,\n display: 'flex',\n },\n description: {\n display: 'grid',\n gridTemplateColumns: '1fr min-content',\n },\n additionalInfoWrapper: {\n display: 'flex',\n flexDirection: 'column',\n gap: tokens.spacingVerticalM,\n },\n additionalInfo: {\n display: 'flex',\n flexDirection: 'column',\n gap: tokens.spacingVerticalM,\n border: `1px solid ${tokens.colorNeutralStroke1}`,\n borderRadius: tokens.borderRadiusMedium,\n padding: tokens.spacingHorizontalM,\n margin: `0 ${tokens.spacingHorizontalM}`,\n },\n additionalInfoIcon: {\n alignSelf: 'center',\n color: tokens.colorBrandForeground1,\n fontSize: '24px',\n marginRight: tokens.spacingHorizontalM,\n },\n additionalInfoMessage: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: tokens.spacingVerticalXS,\n },\n infoIcon: {\n display: 'flex',\n flexDirection: 'column',\n gap: tokens.spacingVerticalXS,\n flex: 1,\n },\n});\n\nconst useVideoClasses = makeStyles({\n container: {\n display: 'flex',\n flexDirection: 'column',\n gap: tokens.spacingHorizontalMNudge,\n },\n preview: {\n borderRadius: tokens.borderRadiusSmall,\n display: 'flex',\n flexDirection: 'column',\n gap: tokens.spacingHorizontalM,\n padding: tokens.spacingHorizontalM,\n backgroundColor: tokens.colorNeutralBackground2,\n\n ':hover': {\n backgroundColor: tokens.colorNeutralBackground2Hover,\n },\n },\n image: {\n width: '200px',\n },\n});\n\nconst VideoPreviews: React.FC<{\n videos: {\n href: string;\n preview: string;\n source: 'youtube';\n title: string;\n }[];\n}> = props => {\n const { videos } = props;\n const classes = useVideoClasses();\n\n return (\n <div className={classes.container}>\n {videos.map(video => (\n <Link className={classes.preview} href={video.href} target=\"_blank\" key={video.href}>\n <img alt={`Video: ${video.preview}`} src={video.preview} className={classes.image} />\n <Text>{video.title}</Text>\n </Link>\n ))}\n </div>\n );\n};\n\nconst getNativeElementsList = (elements: SBEnumType['value']): React.ReactElement => {\n const elementsArr = elements?.map((el, idx) => [\n <code key={idx}>{`<${el}>`}</code>,\n idx !== elements.length - 1 ? ', ' : ' ',\n ]);\n\n return (\n <>\n {elementsArr}\n {elementsArr.length > 1 ? 'elements' : 'element'}\n </>\n );\n};\n\nconst slotRegex = /as\\?:\\s*\"([^\"]+)\"/;\n/**\n * NOTE: this function mutates original story argTypes including all story subcomponents if they are present\n */\nfunction withSlotEnhancer(story: PreparedStory, options: { slotsApi?: boolean; nativePropsApi?: boolean }) {\n const hasArgAsProp = options.nativePropsApi ? story.argTypes.as?.type?.name === 'enum' : false;\n const argAsProp = hasArgAsProp ? (story.argTypes.as.type as SBEnumType).value : null;\n let hasArgAsSlot = false;\n\n type InternalComponentApi = {\n __docgenInfo: {\n props?: Record<string, { type: { name: string } }>;\n };\n [k: string]: unknown;\n };\n\n const transformPropsWithSlotShorthand = (props: Record<string, { type: { name: string } }>) => {\n Object.entries(props).forEach(([key, argType]) => {\n const value: string = argType?.type?.name;\n\n // If DocGen was already transformed, skip the transformation but set hasArgAsSlot to true so that we can show the info message\n if (value.includes('Slot')) {\n hasArgAsSlot = true;\n return;\n }\n // Initial Render Transformation for shorthand slot values (mutates DocGen Object reference)\n if (value.includes('WithSlotShorthandValue')) {\n hasArgAsSlot = true;\n const match = value.match(slotRegex);\n if (match) {\n props[key].type.name = `Slot<\\\"${match[1]}\\\">`;\n } else {\n props[key].type.name = `Slot`;\n }\n }\n });\n };\n\n const transformComponent = (component: InternalComponentApi) => {\n const docGenProps = component?.__docgenInfo?.props;\n if (docGenProps) {\n transformPropsWithSlotShorthand(docGenProps);\n }\n };\n\n const component = story.component as InternalComponentApi;\n const subcomponents = story.subcomponents as Record<string, InternalComponentApi>;\n\n if (options.slotsApi) {\n transformComponent(component);\n if (subcomponents) {\n Object.values(subcomponents).forEach(subcomponent => {\n transformComponent(subcomponent);\n });\n }\n }\n\n return { component, hasArgAsSlot, hasArgAsProp, argAsProp };\n}\n\nconst AdditionalApiDocs: React.FC<{ children: React.ReactElement | React.ReactElement[] }> = ({ children }) => {\n const styles = useStyles();\n return (\n <div className={styles.additionalInfo}>\n <div className={styles.additionalInfoMessage}>\n <InfoFilled className={styles.additionalInfoIcon} />\n <div className={styles.infoIcon}>{children}</div>\n </div>\n </div>\n );\n};\n\nconst RenderArgsTable = ({\n story,\n hideArgsTable,\n showSlotsApi,\n showNativePropsApi,\n}: {\n story: PrimaryStory;\n hideArgsTable: boolean;\n showSlotsApi?: boolean;\n showNativePropsApi?: boolean;\n}) => {\n const { component, hasArgAsProp, hasArgAsSlot, argAsProp } = withSlotEnhancer(story, {\n slotsApi: showSlotsApi,\n nativePropsApi: showNativePropsApi,\n });\n const styles = useStyles();\n\n return hideArgsTable ? null : (\n <>\n <div className={styles.additionalInfoWrapper}>\n {hasArgAsProp && (\n <AdditionalApiDocs>\n <p>\n <b>\n Native props are supported <span role=\"presentation\">🙌</span>\n <br />\n </b>\n <span>\n All HTML attributes native to the\n {getNativeElementsList(argAsProp!)}, including all <code>aria-*</code> and <code>data-*</code>{' '}\n attributes, can be applied as native props on this component.\n </span>\n </p>\n </AdditionalApiDocs>\n )}\n {hasArgAsSlot && (\n <AdditionalApiDocs>\n <p>\n <b>\n Customizing components with slots <span role=\"presentation\">🙌</span>\n </b>\n <br />\n <span>\n Slots in Fluent UI React components are designed to be modified or replaced, providing a flexible\n approach to customizing components. Each slot is exposed as a top-level prop and can be filled with\n primitive values, JSX/TSX, props objects, or render functions. This allows for more dynamic and reusable\n component structures, similar to slots in other frameworks.{' '}\n <Link href=\"/?path=/docs/concepts-developer-customizing-components-with-slots--docs\">\n Customizing components with slots{' '}\n </Link>\n </span>\n </p>\n </AdditionalApiDocs>\n )}\n </div>\n <ArgsTable of={component} />\n </>\n );\n};\n\nconst RenderPrimaryStory = ({\n primaryStory,\n skipPrimaryStory,\n}: {\n primaryStory: PrimaryStory;\n skipPrimaryStory: boolean;\n}) => {\n const styles = useStyles();\n return skipPrimaryStory ? null : (\n <>\n <hr className={styles.divider} />\n <HeaderMdx as=\"h3\" id={nameToHash(primaryStory.name)}>\n {primaryStory.name}\n </HeaderMdx>\n <Primary />\n </>\n );\n};\n\nexport const FluentDocsPage = () => {\n const context = React.useContext(DocsContext);\n\n // Get the fluent docs page configuration from context\n const docsPageConfig = getDocsPageConfig(context);\n\n const stories = context.componentStories();\n\n const primaryStory = stories[0];\n const primaryStoryContext = context.getStoryContext(primaryStory);\n\n assertStoryMetaValues(primaryStory);\n\n const dir = primaryStoryContext.parameters?.dir ?? primaryStoryContext.globals?.[DIR_ID] ?? 'ltr';\n const selectedTheme = themes.find(theme => theme.id === primaryStoryContext.globals![THEME_ID]);\n\n const hideArgsTable = Boolean(primaryStoryContext.parameters?.docs?.hideArgsTable);\n const skipPrimaryStory = Boolean(primaryStoryContext.parameters?.docs?.skipPrimaryStory);\n\n const videos = primaryStoryContext.parameters?.videos ?? null;\n const styles = useStyles();\n\n // If docs page is disabled, return Storybook's default docs page\n if (!docsPageConfig) {\n return (\n <div className=\"sb-unstyled\">\n <Title />\n <Subtitle />\n <Description />\n <RenderPrimaryStory primaryStory={primaryStory} skipPrimaryStory={skipPrimaryStory} />\n <RenderArgsTable story={primaryStory} hideArgsTable={hideArgsTable} />\n <Stories />\n </div>\n );\n }\n\n // Determine what to show based on configuration\n const {\n tableOfContents: showTableOfContents,\n dirSwitcher: showDirSwitcher,\n themePicker: showThemePicker,\n argTable,\n } = docsPageConfig;\n\n // DEBUG\n // console.log('FluentDocsPage', context);\n // console.table(stories.map((s: StoreItem) => ({ id: s.id, kind: s.kind, name: s.name, story: s.story })));\n // console.table(\n // Object.values((context as any).argTypes).map(arg => ({\n // name: arg.name,\n // description: arg.description,\n // type: arg.table?.type?.summary ?? '?',\n // default: arg.table?.defaultValue?.summary ?? '-',\n // })),\n // );\n\n return (\n <div className=\"sb-unstyled\">\n <Title />\n <div className={styles.wrapper}>\n <div className={styles.container}>\n {(showThemePicker || showDirSwitcher) && (\n <div className={styles.globalTogglesContainer}>\n {showThemePicker && <ThemePicker selectedThemeId={selectedTheme?.id} />}\n {showDirSwitcher && <DirSwitch dir={dir} />}\n </div>\n )}\n <Subtitle />\n <div className={styles.description}>\n <Description />\n {videos && <VideoPreviews videos={videos} />}\n </div>\n <RenderPrimaryStory primaryStory={primaryStory} skipPrimaryStory={skipPrimaryStory} />\n <RenderArgsTable\n story={primaryStory}\n hideArgsTable={hideArgsTable}\n showSlotsApi={argTable.slotsApi}\n showNativePropsApi={argTable.nativePropsApi}\n />\n <Stories />\n </div>\n {showTableOfContents && (\n <div className={styles.toc}>\n <Toc stories={stories} />\n </div>\n )}\n </div>\n </div>\n );\n};\n\nfunction assertStoryMetaValues(story: ReturnType<DocsContextProps['componentStories']>[number]) {\n if (story.component === null) {\n throw new Error(\n [\n '🚨 Invalid Story Meta declaration:',\n `- primaryStory.component of componentId:${story.componentId} is \"null\"`,\n '- to resolve this error, please update \"component\" property value in your story definition to reference a React Component or remove it if it is not needed.',\n ].join('\\n'),\n );\n }\n}\n"],"names":["React","DocsContext","ArgsTable","Title","Subtitle","Description","HeaderMdx","Primary","Stories","tokens","Link","Text","makeStyles","InfoFilled","DIR_ID","THEME_ID","themes","getDocsPageConfig","DirSwitch","ThemePicker","Toc","nameToHash","useStyles","divider","height","backgroundColor","border","margin","wrapper","display","gap","toc","flexBasis","flexShrink","container","width","flexGrow","globalTogglesContainer","columnGap","spacingHorizontalXXXL","description","gridTemplateColumns","additionalInfoWrapper","flexDirection","spacingVerticalM","additionalInfo","colorNeutralStroke1","borderRadius","borderRadiusMedium","padding","spacingHorizontalM","additionalInfoIcon","alignSelf","color","colorBrandForeground1","fontSize","marginRight","additionalInfoMessage","alignItems","spacingVerticalXS","infoIcon","flex","useVideoClasses","spacingHorizontalMNudge","preview","borderRadiusSmall","colorNeutralBackground2","colorNeutralBackground2Hover","image","VideoPreviews","props","videos","classes","div","className","map","video","href","target","key","img","alt","src","title","getNativeElementsList","elements","elementsArr","el","idx","code","length","slotRegex","withSlotEnhancer","story","options","hasArgAsProp","nativePropsApi","argTypes","as","type","name","argAsProp","value","hasArgAsSlot","transformPropsWithSlotShorthand","Object","entries","forEach","argType","includes","match","transformComponent","component","docGenProps","__docgenInfo","subcomponents","slotsApi","values","subcomponent","AdditionalApiDocs","children","styles","RenderArgsTable","hideArgsTable","showSlotsApi","showNativePropsApi","p","b","span","role","br","of","RenderPrimaryStory","primaryStory","skipPrimaryStory","hr","id","FluentDocsPage","primaryStoryContext","context","useContext","docsPageConfig","stories","componentStories","getStoryContext","assertStoryMetaValues","dir","parameters","globals","selectedTheme","find","theme","Boolean","docs","tableOfContents","showTableOfContents","dirSwitcher","showDirSwitcher","themePicker","showThemePicker","argTable","selectedThemeId","Error","componentId","join"],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import * as React from 'react';
2
+ import { addons } from '@storybook/preview-api';
3
+ import { Menu, MenuItemRadio, MenuList, MenuPopover, MenuTrigger } from '@fluentui/react-menu';
4
+ import { MenuButton } from '@fluentui/react-button';
5
+ import { makeStyles } from '@griffel/react';
6
+ import { themes, THEME_ID } from '..';
7
+ const useStyles = makeStyles({
8
+ menuButton: {
9
+ minWidth: '210px',
10
+ justifyContent: 'flex-start'
11
+ },
12
+ chevronIcon: {
13
+ marginLeft: 'auto'
14
+ },
15
+ menuPopover: {
16
+ minWidth: '210px'
17
+ }
18
+ });
19
+ /**
20
+ * Theme picker used in the react-components docs header
21
+ */ export const ThemePicker = ({ selectedThemeId })=>{
22
+ const styles = useStyles();
23
+ const [currentThemeId, setCurrentThemeId] = React.useState(selectedThemeId !== null && selectedThemeId !== void 0 ? selectedThemeId : null);
24
+ const setGlobalTheme = (themeId)=>{
25
+ addons.getChannel().emit('updateGlobals', {
26
+ globals: {
27
+ [THEME_ID]: themeId
28
+ }
29
+ });
30
+ };
31
+ const onCheckedValueChange = (e, data)=>{
32
+ const newThemeId = data.checkedItems[0];
33
+ setGlobalTheme(newThemeId);
34
+ setCurrentThemeId(newThemeId);
35
+ };
36
+ const selectedTheme = themes.find((theme)=>theme.id === currentThemeId);
37
+ var _selectedTheme_label;
38
+ return /*#__PURE__*/ React.createElement(Menu, {
39
+ // eslint-disable-next-line react/jsx-no-bind
40
+ onCheckedValueChange: onCheckedValueChange,
41
+ checkedValues: {
42
+ theme: selectedThemeId ? [
43
+ selectedThemeId
44
+ ] : []
45
+ },
46
+ positioning: {
47
+ autoSize: true
48
+ }
49
+ }, /*#__PURE__*/ React.createElement(MenuTrigger, null, /*#__PURE__*/ React.createElement(MenuButton, {
50
+ className: styles.menuButton,
51
+ menuIcon: {
52
+ className: styles.chevronIcon
53
+ }
54
+ }, (_selectedTheme_label = selectedTheme === null || selectedTheme === void 0 ? void 0 : selectedTheme.label) !== null && _selectedTheme_label !== void 0 ? _selectedTheme_label : 'Theme')), /*#__PURE__*/ React.createElement(MenuPopover, {
55
+ className: styles.menuPopover
56
+ }, /*#__PURE__*/ React.createElement(MenuList, null, themes.map((theme)=>/*#__PURE__*/ React.createElement(MenuItemRadio, {
57
+ name: "theme",
58
+ value: theme.id,
59
+ key: theme.id
60
+ }, theme.label)))));
61
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/docs/ThemePicker.tsx"],"sourcesContent":["import * as React from 'react';\nimport { addons } from '@storybook/preview-api';\n\nimport { Menu, MenuItemRadio, MenuList, MenuPopover, MenuTrigger } from '@fluentui/react-menu';\nimport type { MenuProps } from '@fluentui/react-menu';\nimport { MenuButton } from '@fluentui/react-button';\nimport { makeStyles } from '@griffel/react';\n\nimport { themes, ThemeIds, THEME_ID } from '..';\n\nconst useStyles = makeStyles({\n menuButton: {\n minWidth: '210px',\n justifyContent: 'flex-start',\n },\n\n chevronIcon: {\n marginLeft: 'auto',\n },\n\n menuPopover: {\n minWidth: '210px',\n },\n});\n\n/**\n * Theme picker used in the react-components docs header\n */\nexport const ThemePicker: React.FC<{ selectedThemeId?: string }> = ({ selectedThemeId }) => {\n const styles = useStyles();\n const [currentThemeId, setCurrentThemeId] = React.useState(selectedThemeId ?? null);\n\n const setGlobalTheme = (themeId: ThemeIds): void => {\n addons.getChannel().emit('updateGlobals', { globals: { [THEME_ID]: themeId } });\n };\n const onCheckedValueChange: MenuProps['onCheckedValueChange'] = (e, data) => {\n const newThemeId = data.checkedItems[0] as ThemeIds;\n setGlobalTheme(newThemeId);\n setCurrentThemeId(newThemeId);\n };\n\n const selectedTheme = themes.find(theme => theme.id === currentThemeId);\n\n return (\n <Menu\n // eslint-disable-next-line react/jsx-no-bind\n onCheckedValueChange={onCheckedValueChange}\n checkedValues={{ theme: selectedThemeId ? [selectedThemeId] : [] }}\n positioning={{ autoSize: true }}\n >\n <MenuTrigger>\n <MenuButton className={styles.menuButton} menuIcon={{ className: styles.chevronIcon }}>\n {selectedTheme?.label ?? 'Theme'}\n </MenuButton>\n </MenuTrigger>\n <MenuPopover className={styles.menuPopover}>\n <MenuList>\n {themes.map(theme => (\n <MenuItemRadio name=\"theme\" value={theme.id} key={theme.id}>\n {theme.label}\n </MenuItemRadio>\n ))}\n </MenuList>\n </MenuPopover>\n </Menu>\n );\n};\n"],"names":["React","addons","Menu","MenuItemRadio","MenuList","MenuPopover","MenuTrigger","MenuButton","makeStyles","themes","THEME_ID","useStyles","menuButton","minWidth","justifyContent","chevronIcon","marginLeft","menuPopover","ThemePicker","selectedThemeId","styles","currentThemeId","setCurrentThemeId","useState","setGlobalTheme","themeId","getChannel","emit","globals","onCheckedValueChange","e","data","newThemeId","checkedItems","selectedTheme","find","theme","id","checkedValues","positioning","autoSize","className","menuIcon","label","map","name","value","key"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,MAAM,QAAQ,yBAAyB;AAEhD,SAASC,IAAI,EAAEC,aAAa,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,WAAW,QAAQ,uBAAuB;AAE/F,SAASC,UAAU,QAAQ,yBAAyB;AACpD,SAASC,UAAU,QAAQ,iBAAiB;AAE5C,SAASC,MAAM,EAAYC,QAAQ,QAAQ,KAAK;AAEhD,MAAMC,YAAYH,WAAW;IAC3BI,YAAY;QACVC,UAAU;QACVC,gBAAgB;IAClB;IAEAC,aAAa;QACXC,YAAY;IACd;IAEAC,aAAa;QACXJ,UAAU;IACZ;AACF;AAEA;;CAEC,GACD,OAAO,MAAMK,cAAsD,CAAC,EAAEC,eAAe,EAAE;IACrF,MAAMC,SAAST;IACf,MAAM,CAACU,gBAAgBC,kBAAkB,GAAGtB,MAAMuB,QAAQ,CAACJ,4BAAAA,6BAAAA,kBAAmB;IAE9E,MAAMK,iBAAiB,CAACC;QACtBxB,OAAOyB,UAAU,GAAGC,IAAI,CAAC,iBAAiB;YAAEC,SAAS;gBAAE,CAAClB,SAAS,EAAEe;YAAQ;QAAE;IAC/E;IACA,MAAMI,uBAA0D,CAACC,GAAGC;QAClE,MAAMC,aAAaD,KAAKE,YAAY,CAAC,EAAE;QACvCT,eAAeQ;QACfV,kBAAkBU;IACpB;IAEA,MAAME,gBAAgBzB,OAAO0B,IAAI,CAACC,CAAAA,QAASA,MAAMC,EAAE,KAAKhB;QAW/Ca;IATT,qBACE,oBAAChC;QACC,6CAA6C;QAC7C2B,sBAAsBA;QACtBS,eAAe;YAAEF,OAAOjB,kBAAkB;gBAACA;aAAgB,GAAG,EAAE;QAAC;QACjEoB,aAAa;YAAEC,UAAU;QAAK;qBAE9B,oBAAClC,iCACC,oBAACC;QAAWkC,WAAWrB,OAAOR,UAAU;QAAE8B,UAAU;YAAED,WAAWrB,OAAOL,WAAW;QAAC;OACjFmB,CAAAA,uBAAAA,0BAAAA,oCAAAA,cAAeS,KAAK,cAApBT,kCAAAA,uBAAwB,yBAG7B,oBAAC7B;QAAYoC,WAAWrB,OAAOH,WAAW;qBACxC,oBAACb,gBACEK,OAAOmC,GAAG,CAACR,CAAAA,sBACV,oBAACjC;YAAc0C,MAAK;YAAQC,OAAOV,MAAMC,EAAE;YAAEU,KAAKX,MAAMC,EAAE;WACvDD,MAAMO,KAAK;AAO1B,EAAE"}
@@ -0,0 +1,130 @@
1
+ import * as React from 'react';
2
+ import { addons } from '@storybook/preview-api';
3
+ import { NAVIGATE_URL } from '@storybook/core-events';
4
+ import { makeStyles } from '@griffel/react';
5
+ const useTocStyles = makeStyles({
6
+ root: {
7
+ top: '64px',
8
+ position: 'sticky',
9
+ marginLeft: '40px'
10
+ },
11
+ heading: {
12
+ fontSize: '11px',
13
+ fontWeight: 'bold',
14
+ textTransform: 'uppercase',
15
+ marginBottom: '20px'
16
+ },
17
+ ol: {
18
+ position: 'relative',
19
+ listStyleType: 'none',
20
+ marginLeft: 0,
21
+ marginTop: 0,
22
+ paddingInlineStart: '20px',
23
+ '& li': {
24
+ marginBottom: '15px',
25
+ lineHeight: '16px'
26
+ },
27
+ '& a': {
28
+ textDecorationLine: 'none',
29
+ color: '#201F1E',
30
+ fontSize: '14px',
31
+ ':hover': {
32
+ color: '#201F1E'
33
+ }
34
+ },
35
+ '&:before': {
36
+ content: '""',
37
+ position: 'absolute',
38
+ left: 0,
39
+ height: '100%',
40
+ width: '3px',
41
+ backgroundColor: '#EDEBE9',
42
+ borderRadius: '4px'
43
+ }
44
+ },
45
+ selected: {
46
+ position: 'relative',
47
+ '&:after': {
48
+ content: '""',
49
+ position: 'absolute',
50
+ left: '-20px',
51
+ top: 0,
52
+ bottom: 0,
53
+ width: '3px',
54
+ backgroundColor: '#436DCD',
55
+ borderRadius: '4px'
56
+ }
57
+ }
58
+ });
59
+ // // Alternative approach to navigate - rerenders the iframe
60
+ // // Usage: selectStory({ story: s.name, kind: s.kind });
61
+ // const selectStory = (story: { kind: string; story: string }) => {
62
+ // console.log('Select Story', story);
63
+ // addons.getChannel().emit(SELECT_STORY, story);
64
+ // };
65
+ const navigate = (url)=>{
66
+ addons.getChannel().emit(NAVIGATE_URL, url);
67
+ };
68
+ export const nameToHash = (id)=>id.toLowerCase().replace(/[^a-z0-9]/gi, '-');
69
+ export const Toc = ({ stories })=>{
70
+ const [selected, setSelected] = React.useState('');
71
+ const isNavigating = React.useRef(false);
72
+ React.useEffect(()=>{
73
+ // eslint-disable-next-line @nx/workspace-no-restricted-globals
74
+ const observer = new IntersectionObserver((entries)=>{
75
+ if (isNavigating.current) {
76
+ isNavigating.current = false;
77
+ return;
78
+ }
79
+ for (const entry of entries){
80
+ const { intersectionRatio, target } = entry;
81
+ if (intersectionRatio > 0.5) {
82
+ setSelected(target.id);
83
+ return;
84
+ }
85
+ }
86
+ }, {
87
+ threshold: [
88
+ 0.5
89
+ ]
90
+ });
91
+ stories.forEach((link)=>{
92
+ // eslint-disable-next-line @nx/workspace-no-restricted-globals
93
+ const element = document.getElementById(nameToHash(link.name));
94
+ if (element) {
95
+ observer.observe(element);
96
+ }
97
+ });
98
+ return ()=>observer.disconnect();
99
+ }, [
100
+ stories
101
+ ]);
102
+ const tocItems = stories.map((item)=>{
103
+ return {
104
+ ...item,
105
+ selected: nameToHash(item.name) === selected
106
+ };
107
+ });
108
+ const tocClasses = useTocStyles();
109
+ return /*#__PURE__*/ React.createElement("nav", {
110
+ className: tocClasses.root
111
+ }, /*#__PURE__*/ React.createElement("h3", {
112
+ className: tocClasses.heading
113
+ }, "On this page"), /*#__PURE__*/ React.createElement("ol", {
114
+ className: tocClasses.ol
115
+ }, tocItems.map((s)=>{
116
+ const name = nameToHash(s.name);
117
+ return /*#__PURE__*/ React.createElement("li", {
118
+ className: s.selected ? tocClasses.selected : '',
119
+ key: s.id
120
+ }, /*#__PURE__*/ React.createElement("a", {
121
+ href: `#${name}`,
122
+ target: "_self",
123
+ onClick: (e)=>{
124
+ isNavigating.current = true;
125
+ navigate(`#${name}`);
126
+ setSelected(name);
127
+ }
128
+ }, s.name));
129
+ })));
130
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/docs/Toc.tsx"],"sourcesContent":["import * as React from 'react';\nimport { addons } from '@storybook/preview-api';\nimport { NAVIGATE_URL } from '@storybook/core-events';\n\nimport { makeStyles } from '@griffel/react';\n\nconst useTocStyles = makeStyles({\n root: {\n top: '64px',\n position: 'sticky',\n marginLeft: '40px',\n },\n heading: {\n fontSize: '11px',\n fontWeight: 'bold',\n textTransform: 'uppercase',\n marginBottom: '20px',\n },\n ol: {\n position: 'relative',\n listStyleType: 'none',\n marginLeft: 0,\n marginTop: 0,\n paddingInlineStart: '20px',\n '& li': {\n marginBottom: '15px',\n lineHeight: '16px',\n },\n '& a': {\n textDecorationLine: 'none',\n color: '#201F1E',\n fontSize: '14px',\n ':hover': {\n color: '#201F1E',\n },\n },\n '&:before': {\n content: '\"\"',\n position: 'absolute',\n left: 0,\n height: '100%',\n width: '3px',\n backgroundColor: '#EDEBE9',\n borderRadius: '4px',\n },\n },\n selected: {\n position: 'relative',\n '&:after': {\n content: '\"\"',\n position: 'absolute',\n left: '-20px',\n top: 0,\n bottom: 0,\n width: '3px',\n backgroundColor: '#436DCD',\n borderRadius: '4px',\n },\n },\n});\n\ntype TocItem = { name: string; id: string; selected?: boolean };\n\n// // Alternative approach to navigate - rerenders the iframe\n// // Usage: selectStory({ story: s.name, kind: s.kind });\n// const selectStory = (story: { kind: string; story: string }) => {\n// console.log('Select Story', story);\n// addons.getChannel().emit(SELECT_STORY, story);\n// };\n\nconst navigate = (url: string) => {\n addons.getChannel().emit(NAVIGATE_URL, url);\n};\n\nexport const nameToHash = (id: string): string => id.toLowerCase().replace(/[^a-z0-9]/gi, '-');\n\nexport const Toc = ({ stories }: { stories: TocItem[] }) => {\n const [selected, setSelected] = React.useState('');\n const isNavigating = React.useRef<boolean>(false);\n\n React.useEffect(() => {\n // eslint-disable-next-line @nx/workspace-no-restricted-globals\n const observer = new IntersectionObserver(\n (entries: IntersectionObserverEntry[]) => {\n if (isNavigating.current) {\n isNavigating.current = false;\n return;\n }\n for (const entry of entries) {\n const { intersectionRatio, target } = entry;\n if (intersectionRatio > 0.5) {\n setSelected(target.id);\n return;\n }\n }\n },\n {\n threshold: [0.5],\n },\n );\n\n stories.forEach(link => {\n // eslint-disable-next-line @nx/workspace-no-restricted-globals\n const element = document.getElementById(nameToHash(link.name));\n if (element) {\n observer.observe(element);\n }\n });\n\n return () => observer.disconnect();\n }, [stories]);\n\n const tocItems = stories.map(item => {\n return { ...item, selected: nameToHash(item.name) === selected };\n });\n const tocClasses = useTocStyles();\n return (\n <nav className={tocClasses.root}>\n <h3 className={tocClasses.heading}>On this page</h3>\n <ol className={tocClasses.ol}>\n {tocItems.map(s => {\n const name = nameToHash(s.name);\n return (\n <li className={s.selected ? tocClasses.selected : ''} key={s.id}>\n <a\n href={`#${name}`}\n target=\"_self\"\n onClick={e => {\n isNavigating.current = true;\n navigate(`#${name}`);\n setSelected(name);\n }}\n >\n {s.name}\n </a>\n </li>\n );\n })}\n </ol>\n </nav>\n );\n};\n"],"names":["React","addons","NAVIGATE_URL","makeStyles","useTocStyles","root","top","position","marginLeft","heading","fontSize","fontWeight","textTransform","marginBottom","ol","listStyleType","marginTop","paddingInlineStart","lineHeight","textDecorationLine","color","content","left","height","width","backgroundColor","borderRadius","selected","bottom","navigate","url","getChannel","emit","nameToHash","id","toLowerCase","replace","Toc","stories","setSelected","useState","isNavigating","useRef","useEffect","observer","IntersectionObserver","entries","current","entry","intersectionRatio","target","threshold","forEach","link","element","document","getElementById","name","observe","disconnect","tocItems","map","item","tocClasses","nav","className","h3","s","li","key","a","href","onClick","e"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { FluentDocsContainer } from './FluentDocsContainer';
2
+ export { FluentDocsPage } from './FluentDocsPage';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/docs/index.ts"],"sourcesContent":["export { FluentDocsContainer } from './FluentDocsContainer';\nexport { FluentDocsPage } from './FluentDocsPage';\n"],"names":["FluentDocsContainer","FluentDocsPage"],"mappings":"AAAA,SAASA,mBAAmB,QAAQ,wBAAwB;AAC5D,SAASC,cAAc,QAAQ,mBAAmB"}