@aquera/nile-elements 1.8.6 → 1.8.8

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 (88) hide show
  1. package/README.md +7 -0
  2. package/dist/index.js +108 -34
  3. package/dist/nile-markdown-editor/nile-markdown-editor.cjs.js +1 -1
  4. package/dist/nile-markdown-editor/nile-markdown-editor.cjs.js.map +1 -1
  5. package/dist/nile-markdown-editor/nile-markdown-editor.esm.js +1 -1
  6. package/dist/nile-option/nile-option.cjs.js +1 -1
  7. package/dist/nile-option/nile-option.cjs.js.map +1 -1
  8. package/dist/nile-option/nile-option.css.cjs.js +1 -1
  9. package/dist/nile-option/nile-option.css.cjs.js.map +1 -1
  10. package/dist/nile-option/nile-option.css.esm.js +22 -1
  11. package/dist/nile-option/nile-option.esm.js +12 -2
  12. package/dist/nile-select/nile-select.cjs.js +1 -1
  13. package/dist/nile-select/nile-select.cjs.js.map +1 -1
  14. package/dist/nile-select/nile-select.css.cjs.js +1 -1
  15. package/dist/nile-select/nile-select.css.cjs.js.map +1 -1
  16. package/dist/nile-select/nile-select.css.esm.js +16 -7
  17. package/dist/nile-select/nile-select.esm.js +2 -2
  18. package/dist/nile-select/virtual-scroll-helper.cjs.js +1 -1
  19. package/dist/nile-select/virtual-scroll-helper.cjs.js.map +1 -1
  20. package/dist/nile-select/virtual-scroll-helper.esm.js +2 -0
  21. package/dist/nile-side-bar/nile-side-bar.cjs.js +1 -1
  22. package/dist/nile-side-bar/nile-side-bar.cjs.js.map +1 -1
  23. package/dist/nile-side-bar/nile-side-bar.css.cjs.js +1 -1
  24. package/dist/nile-side-bar/nile-side-bar.css.cjs.js.map +1 -1
  25. package/dist/nile-side-bar/nile-side-bar.css.esm.js +31 -2
  26. package/dist/nile-side-bar/nile-side-bar.esm.js +2 -2
  27. package/dist/nile-side-bar-expand/nile-side-bar-expand.cjs.js +1 -1
  28. package/dist/nile-side-bar-expand/nile-side-bar-expand.cjs.js.map +1 -1
  29. package/dist/nile-side-bar-expand/nile-side-bar-expand.esm.js +2 -2
  30. package/dist/nile-virtual-select/nile-virtual-select.cjs.js +3 -3
  31. package/dist/nile-virtual-select/nile-virtual-select.cjs.js.map +1 -1
  32. package/dist/nile-virtual-select/nile-virtual-select.css.cjs.js +1 -1
  33. package/dist/nile-virtual-select/nile-virtual-select.css.cjs.js.map +1 -1
  34. package/dist/nile-virtual-select/nile-virtual-select.css.esm.js +4 -3
  35. package/dist/nile-virtual-select/nile-virtual-select.esm.js +4 -4
  36. package/dist/nile-virtual-select/renderer.cjs.js +1 -1
  37. package/dist/nile-virtual-select/renderer.cjs.js.map +1 -1
  38. package/dist/nile-virtual-select/renderer.esm.js +14 -12
  39. package/dist/src/nile-markdown-editor/nile-markdown-editor.js +1 -1
  40. package/dist/src/nile-markdown-editor/nile-markdown-editor.js.map +1 -1
  41. package/dist/src/nile-option/nile-option.css.js +22 -1
  42. package/dist/src/nile-option/nile-option.css.js.map +1 -1
  43. package/dist/src/nile-option/nile-option.d.ts +3 -0
  44. package/dist/src/nile-option/nile-option.js +21 -0
  45. package/dist/src/nile-option/nile-option.js.map +1 -1
  46. package/dist/src/nile-select/nile-select.css.js +16 -7
  47. package/dist/src/nile-select/nile-select.css.js.map +1 -1
  48. package/dist/src/nile-select/nile-select.d.ts +7 -0
  49. package/dist/src/nile-select/nile-select.js +35 -0
  50. package/dist/src/nile-select/nile-select.js.map +1 -1
  51. package/dist/src/nile-select/virtual-scroll-helper.js +2 -0
  52. package/dist/src/nile-select/virtual-scroll-helper.js.map +1 -1
  53. package/dist/src/nile-side-bar/nile-side-bar.css.js +29 -0
  54. package/dist/src/nile-side-bar/nile-side-bar.css.js.map +1 -1
  55. package/dist/src/nile-side-bar/nile-side-bar.d.ts +16 -0
  56. package/dist/src/nile-side-bar/nile-side-bar.js +30 -0
  57. package/dist/src/nile-side-bar/nile-side-bar.js.map +1 -1
  58. package/dist/src/nile-side-bar/nile-side-bar.test.d.ts +2 -0
  59. package/dist/src/nile-side-bar/nile-side-bar.test.js +96 -0
  60. package/dist/src/nile-side-bar/nile-side-bar.test.js.map +1 -0
  61. package/dist/src/nile-side-bar-expand/nile-side-bar-expand.js +4 -6
  62. package/dist/src/nile-side-bar-expand/nile-side-bar-expand.js.map +1 -1
  63. package/dist/src/nile-virtual-select/nile-virtual-select.css.js +4 -3
  64. package/dist/src/nile-virtual-select/nile-virtual-select.css.js.map +1 -1
  65. package/dist/src/nile-virtual-select/nile-virtual-select.d.ts +4 -0
  66. package/dist/src/nile-virtual-select/nile-virtual-select.js +11 -1
  67. package/dist/src/nile-virtual-select/nile-virtual-select.js.map +1 -1
  68. package/dist/src/nile-virtual-select/renderer.d.ts +2 -2
  69. package/dist/src/nile-virtual-select/renderer.js +6 -4
  70. package/dist/src/nile-virtual-select/renderer.js.map +1 -1
  71. package/dist/src/version.js +1 -1
  72. package/dist/src/version.js.map +1 -1
  73. package/dist/tsconfig.tsbuildinfo +1 -1
  74. package/package.json +1 -1
  75. package/src/nile-markdown-editor/nile-markdown-editor.ts +1 -1
  76. package/src/nile-option/nile-option.css.ts +22 -1
  77. package/src/nile-option/nile-option.ts +18 -0
  78. package/src/nile-select/nile-select.css.ts +16 -7
  79. package/src/nile-select/nile-select.ts +32 -0
  80. package/src/nile-select/virtual-scroll-helper.ts +2 -0
  81. package/src/nile-side-bar/nile-side-bar.css.ts +29 -0
  82. package/src/nile-side-bar/nile-side-bar.test.ts +109 -0
  83. package/src/nile-side-bar/nile-side-bar.ts +29 -0
  84. package/src/nile-side-bar-expand/nile-side-bar-expand.ts +7 -8
  85. package/src/nile-virtual-select/nile-virtual-select.css.ts +4 -3
  86. package/src/nile-virtual-select/nile-virtual-select.ts +9 -1
  87. package/src/nile-virtual-select/renderer.ts +9 -3
  88. package/vscode-html-custom-data.json +43 -4
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Webcomponent nile-elements following open-wc recommendations",
4
4
  "license": "MIT",
5
5
  "author": "nile-elements",
6
- "version": "1.8.6",
6
+ "version": "1.8.8",
7
7
  "main": "dist/src/index.js",
8
8
  "type": "module",
9
9
  "module": "dist/src/index.js",
@@ -618,6 +618,7 @@ export class NileMarkdownEditor extends NileElement {
618
618
  part="base"
619
619
  >
620
620
  <div class="header" part="header">
621
+ ${this.renderToolbar()}
621
622
  <nile-button-toggle-group
622
623
  class="tabs"
623
624
  aria-label="Editor view"
@@ -643,7 +644,6 @@ export class NileMarkdownEditor extends NileElement {
643
644
  `
644
645
  )}
645
646
  </nile-button-toggle-group>
646
- ${this.renderToolbar()}
647
647
  </div>
648
648
  <div
649
649
  class=${classMap({ body: true, 'body--dragging': this.splitDragging })}
@@ -32,12 +32,15 @@ export const styles = css`
32
32
  line-height: var(--nile-line-height-1-8, var(--ng-line-height-text-md));
33
33
  letter-spacing: normal;
34
34
  color: var(--nile-color-dark-1, var(--ng-colors-text-primary-900));
35
- padding: var(--nile-spacing-sm, var(--ng-spacing-md)) var(--nile-spacing-none, var(--ng-spacing-md));
35
+ padding: var(--nile-spacing-sm, var(--ng-spacing-md)) var(--nile-spacing-none, var(--ng-spacing-none));
36
36
  transition: 150ms fill;
37
37
  font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
38
38
  cursor: pointer;
39
39
  margin-bottom: var(--nile-spacing-none, var(--ng-spacing-xxs) )
40
40
  }
41
+ :host([legacy]) .option {
42
+ padding: var(--nile-spacing-sm, var(--ng-spacing-md)) var(--nile-spacing-none, var(--ng-spacing-md));
43
+ }
41
44
 
42
45
  .option--single-select {
43
46
  padding: var(--nile-spacing-9px, var(--ng-spacing-md)) var(--nile-spacing-lg, var(--ng-spacing-md));
@@ -77,12 +80,17 @@ export const styles = css`
77
80
  justify-content: center;
78
81
  visibility: hidden;
79
82
  padding-inline-end: var(--nile-spacing-xs);
83
+ color: var(--nile-colors-primary-600, var(--ng-colors-fg-brand-primary-600));
80
84
  }
81
85
 
82
86
  .option--selected .option__check {
83
87
  visibility: visible;
84
88
  }
85
89
 
90
+ :host([tickonselect][selected]) .option__check {
91
+ visibility: visible;
92
+ }
93
+
86
94
  .option__prefix,
87
95
  .option__suffix {
88
96
  flex: 0 0 auto;
@@ -107,9 +115,22 @@ export const styles = css`
107
115
  margin-left: var(--nile-spacing-lg, var(--ng-spacing-lg));
108
116
  margin-right: var(--nile-spacing-lg, var(--ng-spacing-lg));
109
117
  width:auto;
118
+ display:var(--nile-display-inline-block, var(--ng-display-inline-block));
119
+ }
120
+ :host([legacy]) .option--checkbox{
110
121
  display:var(--nile-display-inline-block, var(--ng-display-none));
111
122
  }
112
123
 
124
+
125
+ :host([tickonselect]) .option--checkbox{
126
+ display: none;
127
+ }
128
+
129
+ :host([tickonselect]) .option{
130
+ padding-left: var(--nile-spacing-lg, var(--ng-spacing-lg));
131
+ padding-right: var(--nile-spacing-lg, var(--ng-spacing-lg));
132
+ }
133
+
113
134
 
114
135
  @media (forced-colors: active) {
115
136
  :host(:hover:not([aria-disabled='true'])) .option {
@@ -62,6 +62,12 @@ export class NileOption extends NileElement {
62
62
 
63
63
  @property({ type: Boolean, reflect: true, attribute: true }) showCheckbox: boolean = false;
64
64
 
65
+ /** Opt OUT of the enhanced styling (enabled by default). Propagated from the parent nile-select. */
66
+ @property({ type: Boolean, reflect: true }) legacy: boolean = false;
67
+
68
+
69
+ @property({ type: Boolean, reflect: true, attribute: true }) tickOnSelect: boolean = false;
70
+
65
71
  /** Draws the option in a disabled state, preventing selection. */
66
72
  @property({ type: Boolean, reflect: true }) disabled = false;
67
73
 
@@ -262,6 +268,18 @@ export class NileOption extends NileElement {
262
268
  `}
263
269
 
264
270
  <slot part="suffix" name="suffix" class="option__suffix"></slot>
271
+
272
+ ${this.tickOnSelect
273
+ ? html`<span part="checked-icon" class="option__check">
274
+ <nile-icon
275
+ name="var(--nile-icon-tick, var(--ng-icon-check))"
276
+ method="var(--nile-svg-method-fill, var(--ng-svg-method-stroke))"
277
+ color="currentColor"
278
+ library="system"
279
+ aria-hidden="true"
280
+ ></nile-icon>
281
+ </span>`
282
+ : ''}
265
283
  </div>`
266
284
  : ''}
267
285
  `;
@@ -355,7 +355,8 @@ export const styles = css`
355
355
  display: inline-flex;
356
356
  align-items: center;
357
357
  justify-content: center;
358
- font-size: inherit;
358
+ font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
359
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
359
360
  color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));
360
361
  border: none;
361
362
  background: none;
@@ -456,21 +457,29 @@ export const styles = css`
456
457
  }
457
458
 
458
459
 
460
+ /* Default: visible + centered footer with proper nxtgen fallbacks. */
459
461
  .select__footer {
460
462
  position: sticky;
461
463
  bottom: 0px;
462
- background: var(--nile-colors-neutral-100);
463
- border-top: 1px solid var(--nile-colors-neutral-400);
464
- display: flex;
464
+ background: var(--nile-colors-neutral-100, var(--ng-colors-bg-secondary));
465
+ border-top: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-secondary));
465
466
  height: 15px;
466
467
  /* Auto layout */
467
- display:var(--nile-display-flex, var(--ng-display-none));
468
+ display: var(--nile-display-flex, var(--ng-display-flex));
468
469
  flex-direction: row;
470
+ align-items: center;
471
+ padding: var(--nile-spacing-md, var(--ng-spacing-md)) var(--nile-spacing-lg, var(--ng-spacing-lg));
472
+ gap: var(--nile-spacing-lg, var(--ng-spacing-lg));
473
+ justify-content: space-between;
474
+ }
475
+
476
+ :host([legacy]) .select__footer {
477
+ background: var(--nile-colors-neutral-100);
478
+ border-top: 1px solid var(--nile-colors-neutral-400);
479
+ display: var(--nile-display-flex, var(--ng-display-none));
469
480
  align-items: flex-start;
470
481
  padding: var(--nile-spacing-md) var(--nile-spacing-lg)
471
482
  var(--nile-spacing-xl);
472
- gap: var(--nile-spacing-lg, var(--ng-spacing-lg));
473
- justify-content: space-between;
474
483
  }
475
484
 
476
485
  .tag__prefix[slot='prefix'] {
@@ -172,6 +172,11 @@ export class NileSelect extends NileElement implements NileFormControl{
172
172
 
173
173
  @property({ type: Boolean, reflect: true }) searchEnabled = false;
174
174
 
175
+ @property({ type: Boolean, reflect: true }) legacy = false;
176
+
177
+ /** Variant: show a tick on the right of the selected option (single-select). Propagated to options. */
178
+ @property({ type: Boolean, reflect: true, attribute: true }) tickOnSelect = false;
179
+
175
180
  @property({attribute:'internal-search-placeholder'}) internalSearchPlaceHolder = 'Search...';
176
181
 
177
182
  @property({ type: Boolean, reflect: true, attribute: true }) enableVisibilityEffect = false;
@@ -386,6 +391,12 @@ export class NileSelect extends NileElement implements NileFormControl{
386
391
  if(_changedProperties.has('multiple')) {
387
392
  this.setCheckBoxInOption(this.multiple as boolean);
388
393
  }
394
+ if(_changedProperties.has('legacy')) {
395
+ this.setLegacyInOptions(this.legacy);
396
+ }
397
+ if(_changedProperties.has('tickOnSelect')) {
398
+ this.setTickOnSelectInOptions(this.tickOnSelect);
399
+ }
389
400
  if (_changedProperties.has('autoResize')) {
390
401
  this.setupResizeObserver();
391
402
  }
@@ -406,6 +417,8 @@ export class NileSelect extends NileElement implements NileFormControl{
406
417
  if(_changedProperties.has('multiple')) {
407
418
  this.setCheckBoxInOption(this.multiple as boolean);
408
419
  }
420
+ this.setLegacyInOptions(this.legacy);
421
+ this.setTickOnSelectInOptions(this.tickOnSelect);
409
422
  if (_changedProperties.has('enableDescription')) {
410
423
  this.setEnableDescriptionInOptions();
411
424
  }
@@ -445,6 +458,25 @@ export class NileSelect extends NileElement implements NileFormControl{
445
458
  option.showCheckbox = checked;
446
459
  })
447
460
  }
461
+ /** Propagates the legacy opt-out flag down to the slotted options. */
462
+ setLegacyInOptions(enabled: boolean): void {
463
+ if(!this.options.length) {
464
+ this.options = this.getAllOptions();
465
+ }
466
+ this.options.forEach((option: NileOption) => {
467
+ option.legacy = enabled;
468
+ })
469
+ }
470
+
471
+ /** Propagates the tick-on-select variant down to the slotted options. */
472
+ setTickOnSelectInOptions(enabled: boolean): void {
473
+ if(!this.options.length) {
474
+ this.options = this.getAllOptions();
475
+ }
476
+ this.options.forEach((option: NileOption) => {
477
+ option.tickOnSelect = enabled;
478
+ })
479
+ }
448
480
 
449
481
  setEnableDescriptionInOptions() {
450
482
  this.options = this.getAllOptions();
@@ -56,6 +56,8 @@ export class VirtualScrollHelper {
56
56
  .descriptionSearchEnabled=${component.descriptionSearchEnabled}
57
57
  .allowHtmlLabel=${component.allowHtmlLabel}
58
58
  .enableDescription=${component.enableDescription}
59
+ .tickOnSelect=${component.tickOnSelect}
60
+ .legacy=${component.legacy}
59
61
  exportparts="
60
62
  select-options,
61
63
  select-no-results,
@@ -45,6 +45,35 @@ export const styles = css`
45
45
  transform: translateX(calc(var(--sidebar-width) - var(--sidebar-collapsed-width)));
46
46
  }
47
47
 
48
+ /*
49
+ * Overlay mode: lift the sidebar out of normal flow so expanding it floats
50
+ * on top of adjacent content instead of pushing siblings. Anchors to the
51
+ * nearest positioned ancestor; set --sidebar-overlay-position: fixed to pin
52
+ * it to the viewport instead.
53
+ */
54
+ :host([overlay]) {
55
+ position: var(--sidebar-overlay-position, absolute);
56
+ top: 0;
57
+ bottom: 0;
58
+ height: 100%;
59
+ }
60
+
61
+ :host([overlay][position='left']) {
62
+ left: 0;
63
+ }
64
+
65
+ :host([overlay][position='right']) {
66
+ right: 0;
67
+ }
68
+
69
+ /* Elevate while expanded so it reads as floating above the page. */
70
+ :host([overlay]:not([collapsed])) {
71
+ box-shadow: var(
72
+ --sidebar-overlay-shadow,
73
+ 0px 8px 24px 0px rgba(119, 125, 130, 0.25)
74
+ );
75
+ }
76
+
48
77
  :host {
49
78
  scrollbar-width: thin;
50
79
  scrollbar-color: #64748b transparent;
@@ -0,0 +1,109 @@
1
+ import { expect, fixture, html, oneEvent } from '@open-wc/testing';
2
+ import './nile-side-bar';
3
+ import '../nile-side-bar-expand/nile-side-bar-expand';
4
+ import type { NileSideBar } from './nile-side-bar';
5
+
6
+ describe('NileSideBar — collapse/expand API', () => {
7
+ it('1. defaults to expanded (not collapsed) and not overlay', async () => {
8
+ const el = await fixture<NileSideBar>(html`<nile-side-bar></nile-side-bar>`);
9
+ expect(el.collapsed).to.be.false;
10
+ expect(el.overlay).to.be.false;
11
+ expect(el.hasAttribute('overlay')).to.be.false;
12
+ });
13
+
14
+ it('2. collapse() sets collapsed state + reflects attribute', async () => {
15
+ const el = await fixture<NileSideBar>(html`<nile-side-bar></nile-side-bar>`);
16
+ el.collapse();
17
+ await el.updateComplete;
18
+ expect(el.collapsed).to.be.true;
19
+ expect(el.hasAttribute('collapsed')).to.be.true;
20
+ });
21
+
22
+ it('3. expand() clears collapsed state', async () => {
23
+ const el = await fixture<NileSideBar>(html`<nile-side-bar collapsed></nile-side-bar>`);
24
+ expect(el.collapsed).to.be.true;
25
+ el.expand();
26
+ await el.updateComplete;
27
+ expect(el.collapsed).to.be.false;
28
+ expect(el.hasAttribute('collapsed')).to.be.false;
29
+ });
30
+
31
+ it('4. toggle() flips state', async () => {
32
+ const el = await fixture<NileSideBar>(html`<nile-side-bar></nile-side-bar>`);
33
+ el.toggle();
34
+ await el.updateComplete;
35
+ expect(el.collapsed).to.be.true;
36
+ el.toggle();
37
+ await el.updateComplete;
38
+ expect(el.collapsed).to.be.false;
39
+ });
40
+
41
+ it('5. toggle(force) sets an explicit state', async () => {
42
+ const el = await fixture<NileSideBar>(html`<nile-side-bar></nile-side-bar>`);
43
+ el.toggle(false); // already expanded -> no-op
44
+ await el.updateComplete;
45
+ expect(el.collapsed).to.be.false;
46
+ el.toggle(true);
47
+ await el.updateComplete;
48
+ expect(el.collapsed).to.be.true;
49
+ });
50
+
51
+ it('6. emits nile-toggle with new collapsed state', async () => {
52
+ const el = await fixture<NileSideBar>(html`<nile-side-bar></nile-side-bar>`);
53
+ setTimeout(() => el.collapse());
54
+ const ev = await oneEvent(el, 'nile-toggle');
55
+ expect(ev.detail.collapsed).to.be.true;
56
+ });
57
+
58
+ it('7. does NOT emit nile-toggle when state is unchanged', async () => {
59
+ const el = await fixture<NileSideBar>(html`<nile-side-bar></nile-side-bar>`);
60
+ let fired = false;
61
+ el.addEventListener('nile-toggle', () => { fired = true; });
62
+ el.expand(); // already expanded
63
+ await el.updateComplete;
64
+ expect(fired).to.be.false;
65
+ });
66
+
67
+ it('8. built-in expand button toggles the sidebar (normal mode)', async () => {
68
+ const el = await fixture<NileSideBar>(html`
69
+ <nile-side-bar>
70
+ <nile-side-bar-expand slot="expand"></nile-side-bar-expand>
71
+ </nile-side-bar>
72
+ `);
73
+ await el.updateComplete;
74
+ const expandEl = el.querySelector('nile-side-bar-expand') as HTMLElement & { collapsed: boolean };
75
+ const btn = expandEl.shadowRoot!.querySelector('.expand-btn') as HTMLElement;
76
+
77
+ let detail: any;
78
+ el.addEventListener('nile-toggle', (e: Event) => { detail = (e as CustomEvent).detail; });
79
+
80
+ btn.click();
81
+ await el.updateComplete;
82
+ expect(el.collapsed).to.be.true;
83
+ expect(detail.collapsed).to.be.true;
84
+ expect(expandEl.collapsed).to.be.true; // arrow icon state stays in sync
85
+
86
+ btn.click();
87
+ await el.updateComplete;
88
+ expect(el.collapsed).to.be.false;
89
+ expect(expandEl.collapsed).to.be.false;
90
+ });
91
+
92
+ it('9. overlay attribute is opt-in and reflects', async () => {
93
+ const el = await fixture<NileSideBar>(html`<nile-side-bar overlay></nile-side-bar>`);
94
+ expect(el.overlay).to.be.true;
95
+ el.overlay = false;
96
+ await el.updateComplete;
97
+ expect(el.hasAttribute('overlay')).to.be.false;
98
+ });
99
+
100
+ it('10. methods work the same with overlay enabled', async () => {
101
+ const el = await fixture<NileSideBar>(html`<nile-side-bar overlay></nile-side-bar>`);
102
+ el.collapse();
103
+ await el.updateComplete;
104
+ expect(el.collapsed).to.be.true;
105
+ el.expand();
106
+ await el.updateComplete;
107
+ expect(el.collapsed).to.be.false;
108
+ });
109
+ });
@@ -18,6 +18,17 @@ import NileElement from '../internal/nile-element';
18
18
  * @attr position - Position of the sidebar ("left" | "right"). Defaults to "left".
19
19
  * @attr width - Expanded width of the sidebar (px).
20
20
  * @attr collapsed-width - Collapsed width of the sidebar (px).
21
+ * @attr overlay - When set, the sidebar is taken out of normal flow and floats
22
+ * on top of adjacent content, so expanding it overlays the page instead of
23
+ * pushing siblings sideways.
24
+ *
25
+ * @event nile-toggle - Fired after the collapsed state changes (via the built-in
26
+ * expand button or the public expand()/collapse()/toggle() methods).
27
+ * `event.detail.collapsed` is the new state.
28
+ *
29
+ * @method expand() - Expand the sidebar.
30
+ * @method collapse() - Collapse the sidebar.
31
+ * @method toggle(force?) - Toggle, or force a specific collapsed state.
21
32
  */
22
33
  @customElement('nile-side-bar')
23
34
  export class NileSideBar extends NileElement {
@@ -25,6 +36,8 @@ export class NileSideBar extends NileElement {
25
36
 
26
37
  @property({ type: Boolean, reflect: true, attribute: true })collapsed: boolean = false;
27
38
 
39
+ @property({ type: Boolean, reflect: true, attribute: true })overlay: boolean = false;
40
+
28
41
  @property({ type: Boolean, reflect: true, attribute: true })fullHeight: boolean = false;
29
42
 
30
43
  @property({ type: Number, attribute: true })width: number | null = null;
@@ -62,6 +75,22 @@ export class NileSideBar extends NileElement {
62
75
  this.style.setProperty('--sidebar-collapsed-width', `${this.collapsedWidth}px`);
63
76
  }
64
77
  }
78
+ public expand(): void {
79
+ this.setCollapsed(false);
80
+ }
81
+ public collapse(): void {
82
+ this.setCollapsed(true);
83
+ }
84
+
85
+ public toggle(force?: boolean): void {
86
+ this.setCollapsed(force ?? !this.collapsed);
87
+ }
88
+
89
+ private setCollapsed(value: boolean): void {
90
+ if (this.collapsed === value) return;
91
+ this.collapsed = value;
92
+ this.emit('nile-toggle', { collapsed: value });
93
+ }
65
94
 
66
95
  public render(): TemplateResult {
67
96
  return html`
@@ -30,17 +30,16 @@ export class NileSideBarExpand extends NileElement {
30
30
  }
31
31
 
32
32
  private toggleSidebar() {
33
- const sidebar = this.closest('nile-side-bar');
33
+ const sidebar = this.closest('nile-side-bar') as
34
+ | (HTMLElement & { toggle?: (force?: boolean) => void })
35
+ | null;
34
36
  if (!sidebar) return;
35
-
36
- const isCollapsed = sidebar.hasAttribute('collapsed');
37
- if (isCollapsed) {
38
- sidebar.removeAttribute('collapsed');
39
- this.collapsed = false;
37
+ if (typeof sidebar.toggle === 'function') {
38
+ sidebar.toggle();
40
39
  } else {
41
- sidebar.setAttribute('collapsed', '');
42
- this.collapsed = true;
40
+ sidebar.toggleAttribute('collapsed', !sidebar.hasAttribute('collapsed'));
43
41
  }
42
+ this.collapsed = sidebar.hasAttribute('collapsed');
44
43
  }
45
44
 
46
45
  public render(): TemplateResult {
@@ -362,7 +362,8 @@ export const styles = css`
362
362
  display: inline-flex;
363
363
  align-items: center;
364
364
  justify-content: center;
365
- font-size: inherit;
365
+ font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
366
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-sm));
366
367
  color: var(--nile-colors-primary-600, var(--ng-colors-text-brand-secondary-700));
367
368
  border: none;
368
369
  background: none;
@@ -454,8 +455,8 @@ export const styles = css`
454
455
  /* Auto layout */
455
456
  display: var(--nile-display-flex, var(--ng-display-flex));
456
457
  flex-direction: row;
457
- align-items: flex-start;
458
- padding: var(--nile-spacing-md, var(--ng-spacing-md)) var(--nile-spacing-lg, var(--ng-spacing-lg)) var(--nile-spacing-xl, var(--ng-spacing-xl));
458
+ align-items: center;
459
+ padding: var(--nile-spacing-md, var(--ng-spacing-md)) var(--nile-spacing-lg, var(--ng-spacing-lg));
459
460
  gap: var(--nile-spacing-lg, var(--ng-spacing-lg));
460
461
  justify-content: space-between;
461
462
  box-sizing: unset;
@@ -285,6 +285,12 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
285
285
 
286
286
  @property({ type: Boolean, reflect: true, attribute: true }) enableDescription = false;
287
287
 
288
+ /** Legacy: hide the option checkbox (the "Show Selected" footer is kept). */
289
+ @property({ type: Boolean, reflect: true }) legacy = false;
290
+
291
+ /** Variant: show a tick on the right of the selected option (single-select). */
292
+ @property({ type: Boolean, reflect: true, attribute: true }) tickOnSelect = false;
293
+
288
294
  @state() showListbox: boolean = false;
289
295
  @state() private wasShowSelectedCheckedOnClose: boolean = false;
290
296
 
@@ -1547,7 +1553,9 @@ export class NileVirtualSelect extends NileElement implements NileFormControl {
1547
1553
  this.optionsLoading || this.loading,
1548
1554
  this.handleScroll.bind(this),
1549
1555
  this.allowHtmlLabel,
1550
- this.enableDescription
1556
+ this.enableDescription,
1557
+ this.tickOnSelect,
1558
+ this.legacy
1551
1559
  );
1552
1560
  }
1553
1561
 
@@ -28,7 +28,9 @@ export class VirtualSelectRenderer {
28
28
  loading?: boolean,
29
29
  onScroll?: (e: Event) => void,
30
30
  allowHtmlLabel?: boolean,
31
- enableDescription?: boolean
31
+ enableDescription?: boolean,
32
+ tickOnSelect?: boolean,
33
+ legacy?: boolean
32
34
  ): TemplateResult {
33
35
  return html`
34
36
  <div part="select-options" class="select__options ${
@@ -51,13 +53,13 @@ export class VirtualSelectRenderer {
51
53
  ${virtualize({
52
54
  items: data,
53
55
  renderItem: (item: any): TemplateResult =>
54
- VirtualSelectRenderer.getItemRenderFunction(item, renderItemFunction, value, multiple, getDisplayText, getItemValue, getItemDescription, getItemPrefix, getItemSuffix, allowHtmlLabel, enableDescription),
56
+ VirtualSelectRenderer.getItemRenderFunction(item, renderItemFunction, value, multiple, getDisplayText, getItemValue, getItemDescription, getItemPrefix, getItemSuffix, allowHtmlLabel, enableDescription, tickOnSelect, legacy),
55
57
  scroller: true,
56
58
  })}
57
59
  `
58
60
  : html`
59
61
  ${data.map((item: any) =>
60
- VirtualSelectRenderer.getItemRenderFunction(item, renderItemFunction, value, multiple, getDisplayText, getItemValue, getItemDescription, getItemPrefix, getItemSuffix, allowHtmlLabel, enableDescription)
62
+ VirtualSelectRenderer.getItemRenderFunction(item, renderItemFunction, value, multiple, getDisplayText, getItemValue, getItemDescription, getItemPrefix, getItemSuffix, allowHtmlLabel, enableDescription, tickOnSelect, legacy)
61
63
  )}
62
64
  `}
63
65
  </div>
@@ -77,6 +79,8 @@ export class VirtualSelectRenderer {
77
79
  getItemSuffix?: (item: any) => string,
78
80
  allowHtmlLabel?: boolean,
79
81
  enableDescription?: boolean,
82
+ tickOnSelect?: boolean,
83
+ legacy?: boolean,
80
84
  ): TemplateResult {
81
85
  if(!item) {
82
86
  return html``;
@@ -105,6 +109,8 @@ export class VirtualSelectRenderer {
105
109
  .selected=${isSelected}
106
110
  .disabled=${isDisabled}
107
111
  .showCheckbox=${multiple}
112
+ .tickOnSelect=${tickOnSelect ?? false}
113
+ .legacy=${legacy ?? false}
108
114
  class=${classMap({
109
115
  option: enableDescription ?? false,
110
116
  [className ?? '']: !!className,