@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.
- package/README.md +7 -0
- package/dist/index.js +108 -34
- package/dist/nile-markdown-editor/nile-markdown-editor.cjs.js +1 -1
- package/dist/nile-markdown-editor/nile-markdown-editor.cjs.js.map +1 -1
- package/dist/nile-markdown-editor/nile-markdown-editor.esm.js +1 -1
- package/dist/nile-option/nile-option.cjs.js +1 -1
- package/dist/nile-option/nile-option.cjs.js.map +1 -1
- package/dist/nile-option/nile-option.css.cjs.js +1 -1
- package/dist/nile-option/nile-option.css.cjs.js.map +1 -1
- package/dist/nile-option/nile-option.css.esm.js +22 -1
- package/dist/nile-option/nile-option.esm.js +12 -2
- package/dist/nile-select/nile-select.cjs.js +1 -1
- package/dist/nile-select/nile-select.cjs.js.map +1 -1
- package/dist/nile-select/nile-select.css.cjs.js +1 -1
- package/dist/nile-select/nile-select.css.cjs.js.map +1 -1
- package/dist/nile-select/nile-select.css.esm.js +16 -7
- package/dist/nile-select/nile-select.esm.js +2 -2
- package/dist/nile-select/virtual-scroll-helper.cjs.js +1 -1
- package/dist/nile-select/virtual-scroll-helper.cjs.js.map +1 -1
- package/dist/nile-select/virtual-scroll-helper.esm.js +2 -0
- package/dist/nile-side-bar/nile-side-bar.cjs.js +1 -1
- package/dist/nile-side-bar/nile-side-bar.cjs.js.map +1 -1
- package/dist/nile-side-bar/nile-side-bar.css.cjs.js +1 -1
- package/dist/nile-side-bar/nile-side-bar.css.cjs.js.map +1 -1
- package/dist/nile-side-bar/nile-side-bar.css.esm.js +31 -2
- package/dist/nile-side-bar/nile-side-bar.esm.js +2 -2
- package/dist/nile-side-bar-expand/nile-side-bar-expand.cjs.js +1 -1
- package/dist/nile-side-bar-expand/nile-side-bar-expand.cjs.js.map +1 -1
- package/dist/nile-side-bar-expand/nile-side-bar-expand.esm.js +2 -2
- package/dist/nile-virtual-select/nile-virtual-select.cjs.js +3 -3
- package/dist/nile-virtual-select/nile-virtual-select.cjs.js.map +1 -1
- package/dist/nile-virtual-select/nile-virtual-select.css.cjs.js +1 -1
- package/dist/nile-virtual-select/nile-virtual-select.css.cjs.js.map +1 -1
- package/dist/nile-virtual-select/nile-virtual-select.css.esm.js +4 -3
- package/dist/nile-virtual-select/nile-virtual-select.esm.js +4 -4
- package/dist/nile-virtual-select/renderer.cjs.js +1 -1
- package/dist/nile-virtual-select/renderer.cjs.js.map +1 -1
- package/dist/nile-virtual-select/renderer.esm.js +14 -12
- package/dist/src/nile-markdown-editor/nile-markdown-editor.js +1 -1
- package/dist/src/nile-markdown-editor/nile-markdown-editor.js.map +1 -1
- package/dist/src/nile-option/nile-option.css.js +22 -1
- package/dist/src/nile-option/nile-option.css.js.map +1 -1
- package/dist/src/nile-option/nile-option.d.ts +3 -0
- package/dist/src/nile-option/nile-option.js +21 -0
- package/dist/src/nile-option/nile-option.js.map +1 -1
- package/dist/src/nile-select/nile-select.css.js +16 -7
- package/dist/src/nile-select/nile-select.css.js.map +1 -1
- package/dist/src/nile-select/nile-select.d.ts +7 -0
- package/dist/src/nile-select/nile-select.js +35 -0
- package/dist/src/nile-select/nile-select.js.map +1 -1
- package/dist/src/nile-select/virtual-scroll-helper.js +2 -0
- package/dist/src/nile-select/virtual-scroll-helper.js.map +1 -1
- package/dist/src/nile-side-bar/nile-side-bar.css.js +29 -0
- package/dist/src/nile-side-bar/nile-side-bar.css.js.map +1 -1
- package/dist/src/nile-side-bar/nile-side-bar.d.ts +16 -0
- package/dist/src/nile-side-bar/nile-side-bar.js +30 -0
- package/dist/src/nile-side-bar/nile-side-bar.js.map +1 -1
- package/dist/src/nile-side-bar/nile-side-bar.test.d.ts +2 -0
- package/dist/src/nile-side-bar/nile-side-bar.test.js +96 -0
- package/dist/src/nile-side-bar/nile-side-bar.test.js.map +1 -0
- package/dist/src/nile-side-bar-expand/nile-side-bar-expand.js +4 -6
- package/dist/src/nile-side-bar-expand/nile-side-bar-expand.js.map +1 -1
- package/dist/src/nile-virtual-select/nile-virtual-select.css.js +4 -3
- package/dist/src/nile-virtual-select/nile-virtual-select.css.js.map +1 -1
- package/dist/src/nile-virtual-select/nile-virtual-select.d.ts +4 -0
- package/dist/src/nile-virtual-select/nile-virtual-select.js +11 -1
- package/dist/src/nile-virtual-select/nile-virtual-select.js.map +1 -1
- package/dist/src/nile-virtual-select/renderer.d.ts +2 -2
- package/dist/src/nile-virtual-select/renderer.js +6 -4
- package/dist/src/nile-virtual-select/renderer.js.map +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/nile-markdown-editor/nile-markdown-editor.ts +1 -1
- package/src/nile-option/nile-option.css.ts +22 -1
- package/src/nile-option/nile-option.ts +18 -0
- package/src/nile-select/nile-select.css.ts +16 -7
- package/src/nile-select/nile-select.ts +32 -0
- package/src/nile-select/virtual-scroll-helper.ts +2 -0
- package/src/nile-side-bar/nile-side-bar.css.ts +29 -0
- package/src/nile-side-bar/nile-side-bar.test.ts +109 -0
- package/src/nile-side-bar/nile-side-bar.ts +29 -0
- package/src/nile-side-bar-expand/nile-side-bar-expand.ts +7 -8
- package/src/nile-virtual-select/nile-virtual-select.css.ts +4 -3
- package/src/nile-virtual-select/nile-virtual-select.ts +9 -1
- package/src/nile-virtual-select/renderer.ts +9 -3
- package/vscode-html-custom-data.json +43 -4
package/package.json
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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.
|
|
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-
|
|
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:
|
|
458
|
-
padding: var(--nile-spacing-md, var(--ng-spacing-md)) var(--nile-spacing-lg, var(--ng-spacing-lg))
|
|
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,
|