@iress-oss/ids-mcp-server 0.0.1-dev.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 (107) hide show
  1. package/LICENSE.txt +201 -0
  2. package/README.md +93 -0
  3. package/dist/componentHandlers.js +241 -0
  4. package/dist/componentHandlers.test.js +380 -0
  5. package/dist/config.js +16 -0
  6. package/dist/index.js +53 -0
  7. package/dist/iressHandlers.js +144 -0
  8. package/dist/iressHandlers.test.js +316 -0
  9. package/dist/resourceHandlers.js +67 -0
  10. package/dist/resourceHandlers.test.js +352 -0
  11. package/dist/searchHandlers.js +287 -0
  12. package/dist/searchHandlers.test.js +524 -0
  13. package/dist/toolHandler.js +31 -0
  14. package/dist/toolHandler.test.js +369 -0
  15. package/dist/tools.js +165 -0
  16. package/dist/types.js +4 -0
  17. package/dist/utils.js +59 -0
  18. package/dist/utils.test.js +286 -0
  19. package/generated/docs/components-alert-docs.md +130 -0
  20. package/generated/docs/components-autocomplete-docs.md +754 -0
  21. package/generated/docs/components-autocomplete-recipes-docs.md +104 -0
  22. package/generated/docs/components-badge-docs.md +148 -0
  23. package/generated/docs/components-button-docs.md +362 -0
  24. package/generated/docs/components-button-recipes-docs.md +76 -0
  25. package/generated/docs/components-buttongroup-docs.md +310 -0
  26. package/generated/docs/components-card-docs.md +494 -0
  27. package/generated/docs/components-card-recipes-docs.md +89 -0
  28. package/generated/docs/components-checkbox-docs.md +193 -0
  29. package/generated/docs/components-checkboxgroup-docs.md +692 -0
  30. package/generated/docs/components-checkboxgroup-recipes-docs.md +119 -0
  31. package/generated/docs/components-col-docs.md +466 -0
  32. package/generated/docs/components-combobox-docs.md +1016 -0
  33. package/generated/docs/components-container-docs.md +91 -0
  34. package/generated/docs/components-divider-docs.md +176 -0
  35. package/generated/docs/components-expander-docs.md +215 -0
  36. package/generated/docs/components-field-docs.md +675 -0
  37. package/generated/docs/components-filter-docs.md +1109 -0
  38. package/generated/docs/components-form-docs.md +2442 -0
  39. package/generated/docs/components-form-recipes-docs.md +892 -0
  40. package/generated/docs/components-hide-docs.md +265 -0
  41. package/generated/docs/components-icon-docs.md +553 -0
  42. package/generated/docs/components-inline-docs.md +868 -0
  43. package/generated/docs/components-input-docs.md +335 -0
  44. package/generated/docs/components-input-recipes-docs.md +140 -0
  45. package/generated/docs/components-inputcurrency-docs.md +157 -0
  46. package/generated/docs/components-inputcurrency-recipes-docs.md +116 -0
  47. package/generated/docs/components-label-docs.md +135 -0
  48. package/generated/docs/components-menu-docs.md +704 -0
  49. package/generated/docs/components-menu-menuitem-docs.md +193 -0
  50. package/generated/docs/components-modal-docs.md +587 -0
  51. package/generated/docs/components-navbar-docs.md +291 -0
  52. package/generated/docs/components-navbar-recipes-docs.md +413 -0
  53. package/generated/docs/components-panel-docs.md +380 -0
  54. package/generated/docs/components-placeholder-docs.md +27 -0
  55. package/generated/docs/components-popover-docs.md +464 -0
  56. package/generated/docs/components-popover-recipes-docs.md +245 -0
  57. package/generated/docs/components-progress-docs.md +104 -0
  58. package/generated/docs/components-radio-docs.md +107 -0
  59. package/generated/docs/components-radiogroup-docs.md +683 -0
  60. package/generated/docs/components-readonly-docs.md +89 -0
  61. package/generated/docs/components-richselect-docs.md +2433 -0
  62. package/generated/docs/components-row-docs.md +877 -0
  63. package/generated/docs/components-select-docs.md +456 -0
  64. package/generated/docs/components-skeleton-docs.md +214 -0
  65. package/generated/docs/components-skeleton-recipes-docs.md +76 -0
  66. package/generated/docs/components-skiplink-docs.md +66 -0
  67. package/generated/docs/components-slideout-docs.md +538 -0
  68. package/generated/docs/components-slider-docs.md +346 -0
  69. package/generated/docs/components-spinner-docs.md +59 -0
  70. package/generated/docs/components-stack-docs.md +265 -0
  71. package/generated/docs/components-table-ag-grid-docs.md +2666 -0
  72. package/generated/docs/components-table-docs.md +1305 -0
  73. package/generated/docs/components-tabset-docs.md +341 -0
  74. package/generated/docs/components-tabset-tab-docs.md +86 -0
  75. package/generated/docs/components-tag-docs.md +115 -0
  76. package/generated/docs/components-text-docs.md +394 -0
  77. package/generated/docs/components-toaster-docs.md +294 -0
  78. package/generated/docs/components-toaster-toast-docs.md +157 -0
  79. package/generated/docs/components-toggle-docs.md +158 -0
  80. package/generated/docs/components-tooltip-docs.md +311 -0
  81. package/generated/docs/components-validationmessage-docs.md +241 -0
  82. package/generated/docs/contact-us-docs.md +27 -0
  83. package/generated/docs/extensions-editor-docs.md +288 -0
  84. package/generated/docs/extensions-editor-recipes-docs.md +39 -0
  85. package/generated/docs/foundations-accessibility-docs.md +62 -0
  86. package/generated/docs/foundations-colours-docs.md +257 -0
  87. package/generated/docs/foundations-consistency-docs.md +52 -0
  88. package/generated/docs/foundations-content-docs.md +23 -0
  89. package/generated/docs/foundations-introduction-docs.md +17 -0
  90. package/generated/docs/foundations-principles-docs.md +70 -0
  91. package/generated/docs/foundations-typography-docs.md +191 -0
  92. package/generated/docs/foundations-user-experience-docs.md +63 -0
  93. package/generated/docs/foundations-visual-design-docs.md +46 -0
  94. package/generated/docs/frequently-asked-questions-docs.md +53 -0
  95. package/generated/docs/get-started-develop-docs.md +48 -0
  96. package/generated/docs/get-started-using-storybook-docs.md +68 -0
  97. package/generated/docs/guidelines.md +812 -0
  98. package/generated/docs/introduction-docs.md +43 -0
  99. package/generated/docs/patterns-loading-docs.md +1304 -0
  100. package/generated/docs/resources-changelog-docs.md +6 -0
  101. package/generated/docs/resources-code-katas-docs.md +29 -0
  102. package/generated/docs/resources-migration-guides-from-v4-to-v5-docs.md +437 -0
  103. package/generated/docs/themes-available-themes-docs.md +66 -0
  104. package/generated/docs/themes-introduction-docs.md +121 -0
  105. package/generated/docs/themes-tokens-docs.md +1200 -0
  106. package/generated/docs/versions-docs.md +17 -0
  107. package/package.json +81 -0
@@ -0,0 +1,413 @@
1
+ [](#recipes)Recipes
2
+ ===================
3
+
4
+ [](#custom-navbars)Custom navbars
5
+ ---------------------------------
6
+
7
+ At its essence, the navbar component is a coloured panel. This means you can easily create custom navbars by creating your own content structure and passing everything into the `children` slot.
8
+
9
+ If you're creating a custom navbar, there are a few things to be aware of. Firstly, some props may not work; for example, the `horizontalAlign` prop won't be applied if there's nothing in the `nav` slot. Similarly, the breakpoint prop won't work if there's nothing in the `nav` slot as it's designed to show and hide `nav` slot content. You can still create responsive designs, but you'll need to set this up yourself.
10
+
11
+ Secondly, you'll need to make sure your content is accessible; for example using a `nav` element with an `aria-label` when you add navigation links.
12
+
13
+ ### [](#custom-responsive-navbar)Custom responsive navbar
14
+
15
+ This example uses existing IDS components to create a custom responsive navbar. On smaller screens the main `nav` in the `IressNavbar` is hidden, and a menu button is shown. The menu button triggers a slideout that contains the nav links.
16
+
17
+ ![Iress logo](assets/ids-logo.png)
18
+
19
+ Custom navbar
20
+ =============
21
+
22
+ [Link 1](#)[Link 2](#)[Link 3](#)
23
+
24
+ Hide code
25
+
26
+ \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
27
+
28
+ const Navbar \= () \=> {
29
+ const { showSlideout } \= useSlideout();
30
+ const containerRef \= useRef<HTMLDivElement | null\>(null);
31
+ return (
32
+ <div ref\={containerRef} style\={{ minHeight: '200px' }}\>
33
+ <IressNavbar
34
+ nav\={
35
+ <IressHide hiddenOn\={{ xs: true, md: false }}\>
36
+ <IressMenu layout\="inline" role\="nav"\>
37
+ <IressMenuItem href\="#"\>Link 1</IressMenuItem\>
38
+ <IressMenuItem href\="#"\>Link 2</IressMenuItem\>
39
+ <IressMenuItem href\="#"\>Link 3</IressMenuItem\>
40
+ </IressMenu\>
41
+ </IressHide\>
42
+ }
43
+ \>
44
+ <IressInline gutter\="md" verticalAlign\="middle"\>
45
+ <IressHide hiddenOn\={{ md: true }}\>
46
+ <IressButton
47
+ mode\="tertiary"
48
+ onClick\={() \=> showSlideout('nav-slideout')}
49
+ \>
50
+ <IressIcon name\="bars" size\="2x" />
51
+ </IressButton\>
52
+ </IressHide\>
53
+ <img src\="assets/ids-logo.png" alt\="Iress logo" />
54
+ <IressText\>
55
+ <h1\>Custom navbar</h1\>
56
+ </IressText\>
57
+ </IressInline\>
58
+ </IressNavbar\>
59
+ <IressSlideout
60
+ id\="nav-slideout"
61
+ style\={{ '--iress-position': 'absolute' } as never}
62
+ position\="left"
63
+ container\={containerRef}
64
+ \>
65
+ <nav aria-label\="tertiary navigation"\>
66
+ <IressMenu role\="nav"\>
67
+ <IressMenuItem href\="#"\>Link 1</IressMenuItem\>
68
+ <IressMenuItem href\="#"\>Link 2</IressMenuItem\>
69
+ <IressMenuItem href\="#"\>Link 3</IressMenuItem\>
70
+ </IressMenu\>
71
+ </nav\>
72
+ </IressSlideout\>
73
+ </div\>
74
+ );
75
+ };
76
+ export const ResponsiveNavbar \= () \=> (
77
+ <IressSlideoutProvider\>
78
+ <Navbar />
79
+ </IressSlideoutProvider\>
80
+ );
81
+
82
+ Copy
83
+
84
+ ### [](#custom-navbar-with-other-ids-components)Custom navbar with other IDS components
85
+
86
+ Not all navbars contain navigation links; often they contain global actions or filters. The example below shows a navbar containing a user dropdown, two buttons and a global search field.
87
+
88
+ Because there are no navigation links, we don't need to add a nav element in this example.
89
+
90
+ ![Iress logo](assets/ids-logo.png)
91
+
92
+ Barry George
93
+
94
+ Person 1Person 2Person 3
95
+
96
+ 4
97
+
98
+ **Input**
99
+
100
+ Hide code
101
+
102
+ \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
103
+
104
+ <IressNavbar horizontalAlign\="between"\>
105
+ <IressInline
106
+ horizontalAlign\="between"
107
+ verticalAlign\="middle"
108
+ \>
109
+ <img
110
+ alt\="Iress logo"
111
+ src\="assets/ids-logo.png"
112
+ />
113
+ <IressInline
114
+ gutter\="md"
115
+ verticalAlign\="stretch"
116
+ \>
117
+ <IressPopover
118
+ activator\={<IressTooltip tooltipText\="User"\><IressButton append\={<IressIcon name\="chevron-down" />} id\="btn"\><IressHide hiddenOn\={{md: false, xs: true}}\>Barry George</IressHide\><IressHide hiddenOn\={{md: true, xs: false}}\><IressIcon name\="user" /></IressHide\></IressButton\></IressTooltip\>}
119
+ align\="bottom-start"
120
+ type\="listbox"
121
+ \>
122
+ <IressMenu\>
123
+ <IressMenuItem\>
124
+ Person 1 </IressMenuItem\>
125
+ <IressMenuItem\>
126
+ Person 2 </IressMenuItem\>
127
+ <IressMenuItem\>
128
+ Person 3 </IressMenuItem\>
129
+ </IressMenu\>
130
+ </IressPopover\>
131
+ <IressBadge
132
+ host\={<IressButton mode\="tertiary"\><IressIcon name\="bell" screenreaderText\="notifications" size\="2x"/></IressButton\>}
133
+ mode\="danger"
134
+ pill
135
+ \>
136
+ 4 </IressBadge\>
137
+ <IressButton mode\="tertiary"\>
138
+ <IressIcon
139
+ name\="plus"
140
+ screenreaderText\="add details"
141
+ size\="2x"
142
+ />
143
+ </IressButton\>
144
+ <IressField
145
+ hiddenLabel
146
+ label\="Input"
147
+ \>
148
+ <IressInput
149
+ name\="test-input"
150
+ prepend\={<IressIcon name\="search" />}
151
+ />
152
+ </IressField\>
153
+ </IressInline\>
154
+ </IressInline\>
155
+ </IressNavbar\>
156
+
157
+ Copy
158
+
159
+ [](#secondary-navigation)Secondary navigation
160
+ ---------------------------------------------
161
+
162
+ The Navbar component should only be used for primary navigation.
163
+
164
+ If your site has secondary navigation, you can use the Menu component. Here are a few examples.
165
+
166
+ ### [](#navbar-combined-with-secondary-navigation)Navbar combined with secondary navigation
167
+
168
+ You can use an `IressPanel` component to render the secondary navigation directly below your navbar. Use an `IressMenu` component for the links, and make sure you wrap it in a `nav` element. You'll need to add an `aria-label` to the `nav` element to make sure its purpose is clear to screen reader users.
169
+
170
+ ![IDS logo](assets/ids-logo.png)
171
+
172
+ [Link 1](#)[Link 2](#)[Link 3](#)
173
+
174
+ Secondary link 1Secondary link 2Secondary link 3
175
+
176
+ Hide code
177
+
178
+ \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
179
+
180
+ <div\>
181
+ <IressNavbar
182
+ logo\={<img alt\="IDS logo" src\="assets/ids-logo.png"/>}
183
+ nav\={<IressMenu layout\="inline" role\="nav"\><IressMenuItem href\="#"\>Link 1</IressMenuItem\><IressMenuItem href\="#" selected\>Link 2</IressMenuItem\><IressMenuItem href\="#"\>Link 3</IressMenuItem\></IressMenu\>}
184
+ />
185
+ <IressPanel
186
+ background\="alt"
187
+ noBorderRadius
188
+ padding\="none"
189
+ \>
190
+ <nav aria-label\="secondary navigation"\>
191
+ <IressMenu
192
+ layout\="inline"
193
+ role\="nav"
194
+ \>
195
+ <IressMenuItem\>
196
+ Secondary link 1 </IressMenuItem\>
197
+ <IressMenuItem\>
198
+ Secondary link 2 </IressMenuItem\>
199
+ <IressMenuItem\>
200
+ Secondary link 3 </IressMenuItem\>
201
+ </IressMenu\>
202
+ </nav\>
203
+ </IressPanel\>
204
+ </div\>
205
+
206
+ Copy
207
+
208
+ ### [](#icon-strips)Icon strips
209
+
210
+ You can change your secondary navigation to an icon strip by passing in icons to the `IressMenuItem` component. This can be rendered as a vertical strip (default), or a horizontal strip (by setting the `IressMenu` layout to `inline`).
211
+
212
+ The example below has some custom CSS to fix the menu to the side of its container. This includes setting `--iress-initial-offset` on the slideout element to ensure the slideout is correctly positioned next to the icon strip.
213
+
214
+ Hide code
215
+
216
+ \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
217
+
218
+ export const NavbarIconStrip \= () \=> {
219
+ const \[secondary, setSecondary\] \= useState(false);
220
+ const containerRef \= useRef<HTMLDivElement | null\>(null);
221
+ const handleSecondaryMenuItem \= () \=> !secondary && setSecondary(true);
222
+ return (
223
+ <div ref\={containerRef} style\={{ minHeight: '250px', height: '100%' }}\>
224
+ <IressNavbar
225
+ style\={
226
+ {
227
+ width: 'fit-content',
228
+ '--iress-nav-padding-x': 0,
229
+ position: 'relative',
230
+ zIndex: 1050,
231
+ height: '100%',
232
+ } as never
233
+ }
234
+ \>
235
+ <nav aria-label\="secondary navigation"\>
236
+ <IressMenu role\="nav"\>
237
+ <IressTooltip align\="right" tooltipText\="Hubs"\>
238
+ <IressMenuItem onClick\={handleSecondaryMenuItem}\>
239
+ <IressIcon name\="chart-network" size\="2x" fixedWidth />
240
+ </IressMenuItem\>
241
+ </IressTooltip\>
242
+ <IressTooltip align\="right" tooltipText\="My links"\>
243
+ <IressMenuItem onClick\={handleSecondaryMenuItem} selected\>
244
+ <IressIcon name\="link" size\="2x" fixedWidth />
245
+ </IressMenuItem\>
246
+ </IressTooltip\>
247
+ <IressTooltip align\="right" tooltipText\="Portfolios"\>
248
+ <IressMenuItem onClick\={handleSecondaryMenuItem}\>
249
+ <IressIcon name\="coins" size\="2x" fixedWidth />
250
+ </IressMenuItem\>
251
+ </IressTooltip\>
252
+ <IressTooltip align\="right" tooltipText\="Research"\>
253
+ <IressMenuItem onClick\={handleSecondaryMenuItem}\>
254
+ <IressIcon name\="binoculars" size\="2x" fixedWidth />
255
+ </IressMenuItem\>
256
+ </IressTooltip\>
257
+ <IressTooltip align\="right" tooltipText\="Admin"\>
258
+ <IressMenuItem onClick\={handleSecondaryMenuItem}\>
259
+ <IressIcon name\="cogs" size\="2x" fixedWidth />
260
+ </IressMenuItem\>
261
+ </IressTooltip\>
262
+ </IressMenu\>
263
+ </nav\>
264
+ </IressNavbar\>
265
+ <IressSlideout
266
+ style\={
267
+ {
268
+ '--iress-position': 'absolute',
269
+ '--iress-initial-offset': '4.5rem',
270
+ zIndex: '1',
271
+ } as never
272
+ }
273
+ position\="left"
274
+ container\={containerRef}
275
+ show\={secondary}
276
+ onShowChange\={(show, reason) \=> {
277
+ if (reason !== 'outside-press') {
278
+ setSecondary(show);
279
+ }
280
+ }}
281
+ \>
282
+ <nav aria-label\="tertiary navigation"\>
283
+ <IressMenu role\="nav"\>
284
+ <IressMenuItem href\="#"\>Link 1</IressMenuItem\>
285
+ <IressMenuItem href\="#"\>Link 2</IressMenuItem\>
286
+ <IressMenuItem href\="#"\>Link 3</IressMenuItem\>
287
+ <IressMenuItem href\="#"\>Link 4</IressMenuItem\>
288
+ <IressMenuItem href\="#"\>Link 5</IressMenuItem\>
289
+ <IressMenuItem href\="#"\>Link 6</IressMenuItem\>
290
+ </IressMenu\>
291
+ </nav\>
292
+ </IressSlideout\>
293
+ </div\>
294
+ );
295
+ };
296
+
297
+ Copy
298
+
299
+ ### [](#fixed-navigation)Fixed navigation
300
+
301
+ A common pattern for small screens is to fix navigation links at the bottom of the screen. This can be done by applying some custom CSS to your secondary navigation.
302
+
303
+ ![IDS logo](assets/ids-logo.png)
304
+
305
+ [](#)
306
+
307
+ About
308
+ -----
309
+
310
+ Iress Uncaged is a portal of Iress software, detailing their adherence to Iress Governance & Standards.
311
+
312
+ Software that is registered with Iress Uncaged will appear [here.](/)
313
+
314
+ In order to register your software with Uncaged, you will need to create an Atlas YAML in the root of your repo, see here for instructions. Once the YAML is available in your main branch your software will appear in this dashboard within 24 Hours.
315
+
316
+ Page heading
317
+ ============
318
+
319
+ Some page content...
320
+
321
+ [
322
+
323
+ Dashboard
324
+
325
+
326
+
327
+ ](#)[
328
+
329
+ Analysis
330
+
331
+
332
+
333
+ ](#)[
334
+
335
+ Messages
336
+
337
+
338
+
339
+ ](#)
340
+
341
+ Hide code
342
+
343
+ \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
344
+
345
+ <div className\="mobile-mockup-wrapper"\>
346
+ <IressNavbar
347
+ horizontalAlign\="between"
348
+ logo\={<img alt\="IDS logo" src\="assets/ids-logo.png"/>}
349
+ nav\={<IressMenu layout\="inline" role\="nav"\><IressTooltip align\="bottom" tooltipText\="User details"\><IressMenuItem href\="#"\><IressIcon name\="user" size\="2x"/></IressMenuItem\></IressTooltip\><IressPopover activator\={<IressTooltip align\="bottom" tooltipText\="Settings"\><IressMenuItem\><IressIcon name\="cog" size\="2x"/></IressMenuItem\></IressTooltip\>} align\="bottom-end" style\={{'--iress-max-width': '12rem'}} type\="dialog"\><IressPanel data-testid\="about-page"\><IressText\><h2\>About</h2\><p\>Iress Uncaged is a portal of Iress software, detailing their adherence to Iress Governance & Standards.</p\><p\>Software that is registered with Iress Uncaged will appear{' '}<a href\="/"\>here.</a\></p\><p\>In order to register your software with Uncaged, you will need to create an Atlas YAML in the root of your repo, see here for instructions. Once the YAML is available in your main branch your software will appear in this dashboard within 24 Hours.</p\></IressText\></IressPanel\></IressPopover\></IressMenu\>}
350
+ />
351
+ <IressPanel\>
352
+ <IressText\>
353
+ <h1\>
354
+ Page heading </h1\>
355
+ </IressText\>
356
+ <IressText\>
357
+ Some page content... </IressText\>
358
+ </IressPanel\>
359
+ <IressPanel
360
+ background\="alt"
361
+ padding\="none"
362
+ style\={{
363
+ insetBlockEnd: '0',
364
+ insetInlineEnd: '0',
365
+ insetInlineStart: '0',
366
+ position: 'absolute'
367
+ }}
368
+ \>
369
+ <nav aria-label\="secondary navigation"\>
370
+ <IressMenu
371
+ fluid
372
+ layout\="inline-equal-width"
373
+ \>
374
+ <IressMenuItem
375
+ href\="#"
376
+ selected
377
+ \>
378
+ <IressStack\>
379
+ <IressIcon name\="tachometer-alt" />
380
+ <IressText\>
381
+ Dashboard </IressText\>
382
+ </IressStack\>
383
+ </IressMenuItem\>
384
+ <IressMenuItem href\="#"\>
385
+ <IressStack\>
386
+ <IressIcon name\="chart-line" />
387
+ <IressText\>
388
+ Analysis </IressText\>
389
+ </IressStack\>
390
+ </IressMenuItem\>
391
+ <IressMenuItem href\="#"\>
392
+ <IressStack\>
393
+ <IressIcon name\="envelope" />
394
+ <IressText\>
395
+ Messages </IressText\>
396
+ </IressStack\>
397
+ </IressMenuItem\>
398
+ </IressMenu\>
399
+ </nav\>
400
+ </IressPanel\>
401
+ </div\>
402
+
403
+ Copy
404
+
405
+ On this page
406
+
407
+ * [Custom navbars](#custom-navbars)
408
+ * [Custom responsive navbar](#custom-responsive-navbar)
409
+ * [Custom navbar with other IDS components](#custom-navbar-with-other-ids-components)
410
+ * [Secondary navigation](#secondary-navigation)
411
+ * [Navbar combined with secondary navigation](#navbar-combined-with-secondary-navigation)
412
+ * [Icon strips](#icon-strips)
413
+ * [Fixed navigation](#fixed-navigation)