@blueprintui/grid 0.0.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 (64) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +3 -0
  3. package/cell/element.css.js +1 -0
  4. package/cell/element.d.ts +27 -0
  5. package/cell/element.js +1 -0
  6. package/column/element.css.js +1 -0
  7. package/column/element.d.ts +29 -0
  8. package/column/element.js +1 -0
  9. package/column/position.controller.d.ts +10 -0
  10. package/column/position.controller.js +1 -0
  11. package/column/size.controller.d.ts +13 -0
  12. package/column/size.controller.js +1 -0
  13. package/custom-elements.json +2107 -0
  14. package/footer/element.css.js +1 -0
  15. package/footer/element.d.ts +22 -0
  16. package/footer/element.js +1 -0
  17. package/grid/element.css.js +1 -0
  18. package/grid/element.d.ts +85 -0
  19. package/grid/element.js +1 -0
  20. package/grid/global.css.js +1 -0
  21. package/grid/layout.controller.d.ts +21 -0
  22. package/grid/layout.controller.js +1 -0
  23. package/include/core.d.ts +13 -0
  24. package/include/core.js +1 -0
  25. package/include/footer.d.ts +6 -0
  26. package/include/footer.js +1 -0
  27. package/include/keynav.d.ts +1 -0
  28. package/include/keynav.js +1 -0
  29. package/include/pagination.d.ts +10 -0
  30. package/include/pagination.js +1 -0
  31. package/include/placeholder.d.ts +6 -0
  32. package/include/placeholder.js +1 -0
  33. package/index.d.ts +7 -0
  34. package/index.js +1 -0
  35. package/internals/controllers/interaction-scroll-visibility.controller.d.ts +12 -0
  36. package/internals/controllers/interaction-scroll-visibility.controller.js +1 -0
  37. package/internals/controllers/key-grid.controller.d.ts +19 -0
  38. package/internals/controllers/key-grid.controller.js +1 -0
  39. package/internals/controllers/key.utils.d.ts +9 -0
  40. package/internals/controllers/key.utils.js +1 -0
  41. package/internals/index.d.ts +4 -0
  42. package/internals/index.js +1 -0
  43. package/internals/utils/dom.d.ts +2 -0
  44. package/internals/utils/dom.js +1 -0
  45. package/internals/utils/events.d.ts +2 -0
  46. package/internals/utils/events.js +1 -0
  47. package/internals/utils/focus.d.ts +7 -0
  48. package/internals/utils/focus.js +1 -0
  49. package/internals/utils/keynav.d.ts +11 -0
  50. package/internals/utils/keynav.js +1 -0
  51. package/internals/utils/traversal.d.ts +5 -0
  52. package/internals/utils/traversal.js +1 -0
  53. package/package.json +44 -0
  54. package/pagination/element.css.js +1 -0
  55. package/pagination/element.d.ts +53 -0
  56. package/pagination/element.js +1 -0
  57. package/placeholder/element.css.js +1 -0
  58. package/placeholder/element.d.ts +45 -0
  59. package/placeholder/element.js +1 -0
  60. package/row/element.css.js +1 -0
  61. package/row/element.d.ts +22 -0
  62. package/row/element.js +1 -0
  63. package/row/position.controller.d.ts +9 -0
  64. package/row/position.controller.js +1 -0
@@ -0,0 +1 @@
1
+ const a=new CSSStyleSheet;a.replaceSync(":host{--min-height:var(--bp-size-9, var(--bp-interaction-touch-target));--background:var(--bp-layer-container-background);--padding-block:0;--padding-inline:var(--bp-size-6)}[part=internal]{min-height:var(--min-height);display:flex;align-items:center;padding-inline:var(--padding-inline);padding-block:var(--padding-block);border-top:var(--cell-border-width, var(--bp-object-border-width-100)) solid var(--bp-object-border-color-100);color:var(--bp-text-color-500);background:var(--background);font-size:var(--bp-text-size-200);width:100%}::slotted(bp-grid-pagination),::slotted(bp-pagination){margin-left:auto}");export{a as default};
@@ -0,0 +1,22 @@
1
+ import { LitElement } from 'lit';
2
+ /**
3
+ * Grid Footer
4
+ *
5
+ * ```typescript
6
+ * import '@blueprintui/grid/include/core.js';
7
+ * ```
8
+ *
9
+ * @element bp-grid-footer
10
+ * @slot - footer content
11
+ * @cssprop --min-height
12
+ * @cssprop --background
13
+ * @cssprop --padding-block
14
+ * @cssprop --padding-inline
15
+ */
16
+ export declare class BpGridFooter extends LitElement {
17
+ #private;
18
+ static styles: CSSStyleSheet[];
19
+ _colSpan: string;
20
+ render(): import("lit-html").TemplateResult<1>;
21
+ connectedCallback(): void;
22
+ }
@@ -0,0 +1 @@
1
+ import{LitElement as t,html as e}from"lit";import{baseStyles as r}from"@blueprintui/components/internals";import s from"./element.css.js";class n extends t{static properties={_colSpan:{state:!0}};static styles=[r,s];constructor(){super();this._colSpan=""}#t=this.attachInternals();render(){return e`<slot role="gridcell" part="internal" .ariaColSpan="${this._colSpan}"></slot>`}connectedCallback(){super.connectedCallback(),this.slot="footer",this.#t.role="row"}}export{n as BpGridFooter};
@@ -0,0 +1 @@
1
+ const o=new CSSStyleSheet;o.replaceSync("@keyframes fadein{0%{opacity:0}to{opacity:1}}[hidden]{display:none!important}:host{--background:var(--bp-layer-container-background);--body-height:auto;--body-min-height:auto;--scrollbar-background:var(--background);--scrollbar-thumb-background:var(--bp-object-border-color-100);--column-height:48px;--row-height:48px;--scroll-padding-top:var(--column-height);--row-content-visibility:auto;--column-text-align:left;--cell-text-algin:left;--border:0;width:100%;display:block;position:relative}:host([range-selection]){user-select:none}:host([borders*='cell']) ::slotted(bp-grid-row),:host([borders*='column']) ::slotted(bp-grid-row){--cell-border-width:var(--bp-object-border-width-100)}:host([borders*='column']) ::slotted(bp-grid-row){--border-top:0;--border-bottom:0}:host([borders*='none']) ::slotted(bp-grid-row),:host([borders*='stripe']) ::slotted(bp-grid-row){--border-top:0;--border-bottom:0}::slotted(bp-grid-row:first-of-type){--border-top:0}::slotted(bp-grid-row:last-of-type){--border-bottom:var(--bp-object-border-width-100) solid var(--bp-object-border-color-100)}:host([borders*='stripe']) ::slotted(bp-grid-row:nth-child(even)){--bp-interaction-offset:var(--bp-interaction-hover-offset)}:host([column-align*='center']){--column-justify-content:center;--cell-justify-content:center}:host([column-align*='end']){--column-justify-content:flex-end;--cell-justify-content:flex-end}[part=internal]{border:var(--border);border-radius:var(--bp-object-border-radius-100);background:var(--background);position:relative}.scroll-container{overflow:auto;height:var(--body-height, 100%);min-height:var(--body-min-height, auto);width:100%;display:flex;flex-direction:column;scroll-padding-top:var(--scroll-padding-top);background:var(--bp-layer-container-background)}:host([scroll-lock]) .scroll-container{overflow:hidden}.body-row-group{display:flex;flex-direction:column;flex:1 1 0%;min-width:fit-content;margin-top:var(--bp-size-2)}.body-row-group:first-child,.column-row-group:first-child{display:contents}.column-row{display:grid;top:0;position:sticky;z-index:99;min-width:fit-content;grid-template-columns:var(--ch-grid);box-shadow:0 var(--bp-object-border-width-100)0 var(--bp-object-border-color-100)}::slotted(bp-grid-row:not([bp-draggable=target]):first-of-type){--box-shadow:var(--bp-object-border-width-100) solid transparent}::-webkit-scrollbar{width:var(--bp-size-5);height:var(--bp-size-5);background:0 0}::-webkit-scrollbar-track{margin-top:var(--bp-interaction-touch-target);box-shadow:inset 0 0 var(--bp-size-5) var(--scrollbar-background)}::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-background);border-radius:var(--bp-object-border-radius-100);border:var(--bp-size-2) solid var(--scrollbar-background)}::-webkit-scrollbar-corner{background:rgba(0 0 0 0%)}");export{o as default};
@@ -0,0 +1,85 @@
1
+ import { LitElement } from 'lit';
2
+ import { BpGridRow } from '../row/element.js';
3
+ import { BpGridCell } from '../cell/element.js';
4
+ import { BpGridColumn } from '../column/element.js';
5
+ import { GridLayoutController } from './layout.controller.js';
6
+ /**
7
+ * Grid
8
+ *
9
+ * ```typescript
10
+ * import '@blueprintui/grid/include/core.js';
11
+ * ```
12
+ *
13
+ * @element bp-grid
14
+ * @cssprop --background
15
+ * @cssprop --body-height
16
+ * @cssprop --scrollbar-background
17
+ * @cssprop --scrollbar-thumb-background
18
+ * @cssprop --column-height
19
+ * @cssprop --row-height
20
+ * @cssprop --scroll-padding-top
21
+ * @cssprop --row-content-visibility
22
+ * @cssprop --column-text-align
23
+ * @cssprop --cell-text-algin
24
+ */
25
+ export declare class BpGrid extends LitElement {
26
+ #private;
27
+ i18n: {
28
+ sort: string;
29
+ expand: string;
30
+ close: string;
31
+ resize: string;
32
+ filter: string;
33
+ loading: string;
34
+ show: string;
35
+ hide: string;
36
+ previous: string;
37
+ next: string;
38
+ first: string;
39
+ last: string;
40
+ today: string;
41
+ browse: string;
42
+ removeFile: string;
43
+ files: string;
44
+ resizeColumn: string;
45
+ closeDetails: string;
46
+ noData: string;
47
+ action: string;
48
+ dropTarget: string;
49
+ firstPage: string;
50
+ previousPage: string;
51
+ nextPage: string;
52
+ lastPage: string;
53
+ pageSize: string;
54
+ };
55
+ height: string;
56
+ columnLayout: 'fixed' | 'flex';
57
+ borders: 'row' | 'cell' | 'column' | 'none' | 'stripe';
58
+ selectable: 'multi' | 'single' | null;
59
+ rangeSelection: boolean;
60
+ scrollLock: boolean;
61
+ elevation: 'raised' | 'flat';
62
+ protected _id: string;
63
+ protected gridLayoutController: GridLayoutController;
64
+ static styles: CSSStyleSheet[];
65
+ static controllers: Set<any>;
66
+ get keyGridControllerConfig(): {
67
+ grid: HTMLElement;
68
+ rows: HTMLElement[];
69
+ cells: (BpGridCell | BpGridColumn)[];
70
+ };
71
+ get gridLayoutControllerConfig(): {
72
+ columns: BpGridColumn[];
73
+ columnLayout: "fixed" | "flex";
74
+ height: string;
75
+ };
76
+ get gridColumnSizeControllerConfig(): {
77
+ columns: BpGridColumn[];
78
+ rows: BpGridRow[];
79
+ };
80
+ get keyNavGrid(): HTMLElement;
81
+ _internals: ElementInternals;
82
+ render(): import("lit-html").TemplateResult<1>;
83
+ constructor();
84
+ connectedCallback(): Promise<void>;
85
+ }
@@ -0,0 +1 @@
1
+ import{__decorate as t}from"tslib";import{LitElement as e,html as o}from"lit";import{baseStyles as i,elevationStyles as r,I18nService as l,createId as s,attachRootNodeStyles as n,i18n as a,ariaMultiSelectable as c}from"@blueprintui/components/internals";import{interactionScrollVisibility as h}from"../internals/controllers/interaction-scroll-visibility.controller.js";import{GridLayoutController as u}from"./layout.controller.js";import d from"./element.css.js";import p from"./global.css.js";var m;let g=m=class extends e{static properties={i18n:{type:Object},height:{type:String,reflect:!0},columnLayout:{type:String,reflect:!0,attribute:"column-layout"},borders:{type:String,reflect:!0},selectable:{type:String,reflect:!0},rangeSelection:{type:Boolean,reflect:!0,attribute:"range-selection"},scrollLock:{type:Boolean,reflect:!0,attribute:"scroll-lock"},elevation:{type:String,reflect:!0},_id:{type:String,reflect:!0}};gridLayoutController=new u(this);static styles=[i,r,d];static controllers=new Set;get keyGridControllerConfig(){return{grid:this.keyNavGrid,rows:[this.#t,...Array.from(this.#e)],cells:[...Array.from(this.#o),...Array.from(this.#i)]}}get gridLayoutControllerConfig(){return{columns:Array.from(this.#o),columnLayout:this.columnLayout,height:this.height}}get gridColumnSizeControllerConfig(){return{columns:Array.from(this.#o),rows:Array.from(this.#e)}}get#o(){return this.querySelectorAll("bp-grid-column")}get#t(){return this.shadowRoot.querySelector(".column-row-group")}get#e(){return this.querySelectorAll("bp-grid-row")}get#i(){return this.querySelectorAll("bp-grid-cell")}get#r(){return this.querySelector("bp-grid-placeholder")}get#l(){return this.querySelector("bp-grid-footer")}get keyNavGrid(){return this.shadowRoot.querySelector(".scroll-container")}_internals=this.attachInternals();render(){return o`<div role="presentation" elevation part="internal"><div role="presentation" class="scroll-container"><div role="presentation" class="column-row-group"><div role="row" aria-rowindex="1" class="column-row"><slot name="columns"><bp-grid-column draggable-hidden><span sr-only>${this.i18n.noData}</span></bp-grid-column></slot></div></div><slot role="presentation" class="body-row-group"></slot></div><slot name="footer"></slot><slot name="detail"></slot></div>`}constructor(){super();this._internals.role="grid",this.#s(),this.i18n=l.keys.actions,this.columnLayout="fixed",this.borders="row",this.rangeSelection=!1,this.scrollLock=!1,this._id=s()}async connectedCallback(){super.connectedCallback(),n(this.parentNode,[p]),await this.updateComplete,m.controllers.forEach((t=>new t(this))),this.#n(),this.shadowRoot.addEventListener("slotchange",(()=>this.updateComplete.then((()=>this.#n()))))}#s(){this.addEventListener("sort",(t=>{const e=t.composedPath().find((t=>"BP-GRID-COLUMN"===t.tagName));e&&(e.ariaSort=t.detail)}))}#a=0;get#c(){return this.#a++,1===this.#a&&!this.rangeSelection&&!Array.from(this.#o).find((t=>""!==t.position||void 0!==t.type))}async#n(){this.#c||(this.#h(),this.#u(),this.#d(),this.#p(),this.#m(),this.#g())}#h(){const t=Math.max(this.#e?.length,1),e=this.#l?1:0;this._internals.ariaRowCount=""+(1+t+e),this._internals.ariaColCount=""+this.#o.length}#u(){this.#o.forEach(((t,e)=>t.ariaColIndex=""+(e+1)))}#d(){this.#e?.forEach(((t,e)=>t.ariaRowIndex=""+(e+2)))}#p(){this.#i?.forEach(((t,e)=>t.ariaColIndex=""+(e%this.#o.length+1)))}#m(){this.#r&&(this.#r.ariaRowCount=""+(this.#e.length+1),this.#r._colSpan=this._internals.ariaColCount)}#g(){this.#l&&(this.#l.ariaRowCount=""+(this.#e.length+2),this.#l._colSpan=this._internals.ariaColCount)}};g=m=t([a({key:"actions"}),c(),h()],g);export{g as BpGrid};
@@ -0,0 +1 @@
1
+ const e=new CSSStyleSheet;e.replaceSync("bp-grid-row:has(bp-checkbox:--checked),bp-grid-row:has(bp-radio:--checked){--bp-interaction-offset:var(--bp-interaction-selected-offset)}");export{e as default};
@@ -0,0 +1,21 @@
1
+ import { ReactiveControllerHost } from 'lit';
2
+ export declare type Column = HTMLElement & {
3
+ width: string;
4
+ type: string;
5
+ };
6
+ declare type Grid = HTMLElement & {
7
+ gridLayoutControllerConfig: {
8
+ columns: NodeListOf<Column> | Column[];
9
+ columnLayout: 'fixed' | 'flex';
10
+ height?: string;
11
+ };
12
+ };
13
+ export declare class GridLayoutController {
14
+ #private;
15
+ private host;
16
+ constructor(host: ReactiveControllerHost & Grid);
17
+ hostConnected(): Promise<void>;
18
+ hostUpdated(): void;
19
+ hostDisconnected(): void;
20
+ }
21
+ export {};
@@ -0,0 +1 @@
1
+ import{listenForAttributeListChange as t,isNumericString as i}from"@blueprintui/components/internals";import{onChildListMutation as s}from"../internals/utils/events.js";class e{host;#t=[];#i;get#s(){return Array.from(this.#i??[])}get#e(){return this.host.gridLayoutControllerConfig}get#o(){return this.#s.filter((t=>!t.hidden))}get#h(){return this.#o["rtl"===this.host.getAttribute("dir")?0:this.#o.length-1]}constructor(t){this.host=t,this.host.addController(this)}async hostConnected(){await this.host.updateComplete,this.#r(),this.host.addEventListener("resizeChange",(()=>this.#n()),{once:!0,capture:!0}),this.#t.push(s(this.host,(async t=>{await this.host.updateComplete,t&&this.#l(t)&&this.#r()}))),this.#t.push(t(this.host,["hidden"],(()=>this.#r())))}hostUpdated(){this.#e.height&&this.host.style.setProperty("--body-height",i(this.#e.height)?this.#e.height+"px":this.#e.height)}hostDisconnected(){this.#t.forEach((t=>t.disconnect()))}#l(t){return[...Array.from(t.removedNodes),...Array.from(t.addedNodes)].find((t=>"BP-GRID-COLUMN"===t.tagName))}#n(){"fixed"===this.#e.columnLayout&&(this.#o.filter((t=>t.width)).forEach((t=>this.host.style.setProperty("--ch"+t.ariaColIndex,i(t.width)?t.width+"px":t.width))),this.#o.filter((t=>!t.width&&parseInt(t.ariaColIndex)!==this.#s.length)).forEach((t=>this.host.style.setProperty("--ch"+t.ariaColIndex,parseInt(getComputedStyle(t).width)+"px"))),this.host.style.setProperty("--ch"+this.#h.ariaColIndex,`minmax(${this.#d()??parseInt(getComputedStyle(this.#h).width)+"px"}, 100%)`))}#d(){return i(this.#h.width)?this.#h.width+"px":this.#h.width?this.#h.width:null}#r(){this.#i=this.#e.columns,this.#a(),this.#u()}#a(){const t=this.#s.filter((t=>!t.hidden)).reduce(((t,s,e)=>`${t} var(--ch${e+1}, ${(i(s.width)?s.width+"px":s.width)||"1fr"})`),"");this.host.style.setProperty("--ch-grid",t)}#u(){this.#o.forEach(((t,i)=>{t.removeAttribute("draggable-hidden"),"action"===t.type&&"action"===this.#o[i+1]?.type&&t.setAttribute("draggable-hidden","")})),this.#h?.setAttribute("draggable-hidden","")}}export{e as GridLayoutController};
@@ -0,0 +1,13 @@
1
+ import '@blueprintui/components/include/button-icon.js';
2
+ import { BpGrid } from '../grid/element.js';
3
+ import { BpGridRow } from '../row/element.js';
4
+ import { BpGridCell } from '../cell/element.js';
5
+ import { BpGridColumn } from '../column/element.js';
6
+ declare global {
7
+ interface HTMLElementTagNameMap {
8
+ 'bp-grid': BpGrid;
9
+ 'bp-grid-row': BpGridRow;
10
+ 'bp-grid-cell': BpGridCell;
11
+ 'bp-grid-column': BpGridColumn;
12
+ }
13
+ }
@@ -0,0 +1 @@
1
+ import"@blueprintui/components/include/button-icon.js";import{BpGrid as e}from"../grid/element.js";import{BpGridRow as m}from"../row/element.js";import{BpGridCell as t}from"../cell/element.js";import{BpGridColumn as o}from"../column/element.js";customElements.get("bp-grid")||customElements.define("bp-grid",e),customElements.get("bp-grid-row")||customElements.define("bp-grid-row",m),customElements.get("bp-grid-cell")||customElements.define("bp-grid-cell",t),customElements.get("bp-grid-column")||customElements.define("bp-grid-column",o);
@@ -0,0 +1,6 @@
1
+ import { BpGridFooter } from '../footer/element.js';
2
+ declare global {
3
+ interface HTMLElementTagNameMap {
4
+ 'bp-grid-footer': BpGridFooter;
5
+ }
6
+ }
@@ -0,0 +1 @@
1
+ import{BpGridFooter as e}from"../footer/element.js";customElements.get("bp-grid-footer")||customElements.define("bp-grid-footer",e);
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{BpGrid as r}from"../grid/element.js";import{KeyGridController as o}from"../internals/controllers/key-grid.controller.js";r.controllers.add(o);
@@ -0,0 +1,10 @@
1
+ import { BpGridPagination } from '../pagination/element.js';
2
+ import '@blueprintui/components/include/button-icon.js';
3
+ import '@blueprintui/components/include/pagination.js';
4
+ import '@blueprintui/components/include/select.js';
5
+ import '@blueprintui/components/include/input.js';
6
+ declare global {
7
+ interface HTMLElementTagNameMap {
8
+ 'bp-grid-pagination': BpGridPagination;
9
+ }
10
+ }
@@ -0,0 +1 @@
1
+ import{BpGridPagination as n}from"../pagination/element.js";import"@blueprintui/components/include/button-icon.js";import"@blueprintui/components/include/pagination.js";import"@blueprintui/components/include/select.js";import"@blueprintui/components/include/input.js";customElements.get("bp-grid-pagination")||customElements.define("bp-grid-pagination",n);
@@ -0,0 +1,6 @@
1
+ import { BpGridPlaceholder } from '../placeholder/element.js';
2
+ declare global {
3
+ interface HTMLElementTagNameMap {
4
+ 'bp-grid-placeholder': BpGridPlaceholder;
5
+ }
6
+ }
@@ -0,0 +1 @@
1
+ import{BpGridPlaceholder as e}from"../placeholder/element.js";customElements.get("bp-grid-placeholder")||customElements.define("bp-grid-placeholder",e);
package/index.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export * from './cell/element.js';
2
+ export * from './column/element.js';
3
+ export * from './footer/element.js';
4
+ export * from './pagination/element.js';
5
+ export * from './placeholder/element.js';
6
+ export * from './row/element.js';
7
+ export * from './grid/element.js';
package/index.js ADDED
@@ -0,0 +1 @@
1
+ export{BpGridCell}from"./cell/element.js";export{BpGridColumn}from"./column/element.js";export{BpGridFooter}from"./footer/element.js";export{BpGridPagination}from"./pagination/element.js";export{BpGridPlaceholder}from"./placeholder/element.js";export{BpGridRow}from"./row/element.js";export{BpGrid}from"./grid/element.js";
@@ -0,0 +1,12 @@
1
+ import { ReactiveController, ReactiveElement } from 'lit';
2
+ /**
3
+ * Default to `content-visibility: auto` for lazy render, on scroll set all row items to `content-visibility: visible` for eager render
4
+ * Enables fast initial render and smooth eager rendering anytime after for items within a bounded scroll box.
5
+ */
6
+ export declare function interactionScrollVisibility<T extends ReactiveElement>(): ClassDecorator;
7
+ export declare class InteractionScrollVisibilityController<T extends ReactiveElement> implements ReactiveController {
8
+ #private;
9
+ private host;
10
+ constructor(host: T);
11
+ hostConnected(): Promise<void>;
12
+ }
@@ -0,0 +1 @@
1
+ function t(){return t=>t.addInitializer((t=>new i(t)))}class i{host;constructor(t){this.host=t,this.host.addController(this)}async hostConnected(){await this.host.updateComplete,this.host.renderRoot.addEventListener("scroll",(()=>this.#t()),{once:!0,capture:!0}),this.host.renderRoot.addEventListener("pointerdown",(()=>this.#t()),{once:!0,capture:!0})}#t(){this.host.style.setProperty("--row-content-visibility","visibile")}}export{i as InteractionScrollVisibilityController,t as interactionScrollVisibility};
@@ -0,0 +1,19 @@
1
+ import { ReactiveController, ReactiveElement } from 'lit';
2
+ export interface KeyGridConfig {
3
+ keyGridControllerConfig: {
4
+ grid?: HTMLElement;
5
+ rows: NodeListOf<HTMLElement> | HTMLElement[];
6
+ cells: NodeListOf<HTMLElement> | HTMLElement[];
7
+ };
8
+ }
9
+ /**
10
+ * https://w3c.github.io/aria-practices/#gridNav_focus
11
+ */
12
+ export declare function keyGrid<T extends ReactiveElement & KeyGridConfig>(): ClassDecorator;
13
+ export declare class KeyGridController<T extends ReactiveElement & KeyGridConfig> implements ReactiveController {
14
+ #private;
15
+ private host;
16
+ constructor(host: T);
17
+ hostConnected(): Promise<void>;
18
+ hostDisconnected(): void;
19
+ }
@@ -0,0 +1 @@
1
+ import{onFirstInteraction as t,onChildListMutation as e}from"../utils/events.js";import{getFlattenedDOMTree as s,getFlattenedFocusableItems as i}from"../utils/traversal.js";import{contextMenuClick as r}from"../utils/dom.js";import{validKeyNavigationCode as o}from"../utils/keynav.js";import{initializeKeyListItems as l,simpleFocusable as n,getActiveElement as h,setActiveKeyListItem as c,focusElement as d}from"../utils/focus.js";import{getNextKeyGridItem as a}from"./key.utils.js";function f(){return t=>t.addInitializer((t=>new u(t)))}class u{host;#t=[];get#e(){return this.host.keyGridControllerConfig.grid}get#s(){return Array.from(this.host.keyGridControllerConfig.rows)}get#i(){return Array.from(this.host.keyGridControllerConfig.cells)}get#r(){return Array.from(this.#i).find((t=>0===t.tabIndex))}constructor(t){this.host=t,this.host.addController(this)}async hostConnected(){await this.host.updateComplete,await t(this.host),l(this.#i),this.#e.addEventListener("mouseup",(t=>this.#o(t))),this.#e.addEventListener("keydown",(t=>this.#l(t))),this.#e.addEventListener("keyup",(t=>this.#n(t))),this.#t.push(e(this.#e,(()=>l(this.#i))))}hostDisconnected(){this.#t.forEach((t=>t.disconnect()))}#o(t){if(!r(t)){const e=t.composedPath().find((t=>this.#i.find((e=>e===t))));e&&this.#h(t,e)}}#l(t){if(o(t)&&n(h())){const{x:e,y:i}=a(this.#i,this.#s,{code:t.code,ctrlKey:t.ctrlKey,dir:this.host.dir}),r=Array.from(s(this.#s[i])).filter((t=>!!this.#i.find((e=>e===t))))[e];this.#h(t,r),t.preventDefault()}}#h(t,e){c(this.#i,e);const s=i(e).filter((t=>!t.hidden&&!t.ariaHidden)),r=s.filter((t=>n(t)));1===r.length&&1===s.length?d(r[0]):d(e),e.dispatchEvent(new CustomEvent("bpKeyChange",{bubbles:!0,detail:{code:t.code,shiftKey:t.shiftKey,activeItem:e}}))}#n(t){"Escape"===t.code&&this.#r?.focus(),"Enter"===t.code&&this.#r===t.composedPath()[0]&&i(this.#r)[0]?.focus()}}export{u as KeyGridController,f as keyGrid};
@@ -0,0 +1,9 @@
1
+ import { KeyNavigationCode } from '../utils/keynav.js';
2
+ export declare function getNextKeyGridItem(cells: HTMLElement[], rows: HTMLElement[], config: {
3
+ code: KeyNavigationCode | string;
4
+ ctrlKey: boolean;
5
+ dir: string;
6
+ }): {
7
+ x: number;
8
+ y: number;
9
+ };
@@ -0,0 +1 @@
1
+ import{KeyNavigationCode as r}from"../utils/keynav.js";import{getFlattenedDOMTree as t}from"../utils/traversal.js";function o(o,e,n){const i=o.find((r=>0===r.tabIndex)),f=e.find((r=>t(r).find((r=>r===i)))),d=Array.from(t(f)).filter((r=>!!o.find((t=>t===r)))),l=e.length-1,w=d.length-1,{code:a,ctrlKey:s,dir:A}=n;let g=d.indexOf(i),m=e.indexOf(f);const c="rtl"===A?r.ArrowRight:r.ArrowLeft,p="rtl"===A?r.ArrowLeft:r.ArrowRight;return a===r.ArrowUp&&0!==m?m-=1:a===r.ArrowDown&&m<l?m+=1:a===c&&0!==g?g-=1:a===p&&g<w?g+=1:a===r.End?(g=w,s&&(m=l)):a===r.Home?(g=0,s&&(m=0)):a===r.PageUp?m=m-4>0?m-4:0:a===r.PageDown&&(m=m+4<l?m+4:l),{x:g,y:m}}export{o as getNextKeyGridItem};
@@ -0,0 +1,4 @@
1
+ export * from './controllers/interaction-scroll-visibility.controller.js';
2
+ export * from './controllers/key-grid.controller.js';
3
+ export * from './utils/dom.js';
4
+ export * from './utils/events.js';
@@ -0,0 +1 @@
1
+ export{InteractionScrollVisibilityController,interactionScrollVisibility}from"./controllers/interaction-scroll-visibility.controller.js";export{KeyGridController,keyGrid}from"./controllers/key-grid.controller.js";export{contextMenuClick}from"./utils/dom.js";export{onChildListMutation,onFirstInteraction}from"./utils/events.js";
@@ -0,0 +1,2 @@
1
+ /** right click with context menus & keyboard mouse control https://apple.stackexchange.com/questions/32715/how-do-i-open-the-context-menu-from-a-mac-keyboard */
2
+ export declare function contextMenuClick(event: MouseEvent): boolean;
@@ -0,0 +1 @@
1
+ function t(t){return 2===t.buttons&&!t.ctrlKey||1===t.buttons&&t.ctrlKey}export{t as contextMenuClick};
@@ -0,0 +1,2 @@
1
+ export declare function onChildListMutation(element: HTMLElement, fn: (mutation?: MutationRecord) => void): MutationObserver;
2
+ export declare function onFirstInteraction(element: HTMLElement): Promise<null>;
@@ -0,0 +1 @@
1
+ function e(e,n){const t=new MutationObserver((e=>{for(const t of e)"childList"===t.type&&n(t)}));return t.observe(e,{childList:!0}),t}function n(e){return new Promise((n=>{const t=()=>{n(null),e.__bpTouched=!0};e.__bpTouched&&n(null),e.addEventListener("touchstart",t,{once:!0,passive:!0}),e.addEventListener("mouseover",t,{once:!0,passive:!0}),e.addEventListener("keydown",t,{once:!0,passive:!0}),e.addEventListener("focus",t,{once:!0,passive:!0})}))}export{e as onChildListMutation,n as onFirstInteraction};
@@ -0,0 +1,7 @@
1
+ export declare function focusable(element: Element): boolean;
2
+ /** focus primitives, any interactive element does not requiring advanced keyboard interactions like arrow/navigation */
3
+ export declare function simpleFocusable(element: Element): boolean;
4
+ export declare function getActiveElement(root?: Document | ShadowRoot): Element | null;
5
+ export declare function focusElement(element: HTMLElement): void;
6
+ export declare function setActiveKeyListItem(items: NodeListOf<HTMLElement> | HTMLElement[], item: HTMLElement): void;
7
+ export declare function initializeKeyListItems(items: NodeListOf<HTMLElement> | HTMLElement[]): void;
@@ -0,0 +1 @@
1
+ function t(t){return t.matches("a[href],area[href],input:not([disabled]),button:not([disabled]),select:not([disabled]),textarea:not([disabled]),iframe,object,embed,*[tabindex],*[contenteditable=true],[role=button]:not([disabled])")}function e(t){return t.matches("a[href],button:not([disabled]),input[type=checkbox],input[type=radio],object,embed,*[tabindex],[role=button]:not([disabled])")}function n(t=document){return t.activeElement&&t.activeElement.shadowRoot?n(t.activeElement.shadowRoot)??t.activeElement:t.activeElement}function o(e){e&&!t(e)?(e.setAttribute("tabindex","-1"),e.focus(),e.addEventListener("blur",(()=>e.removeAttribute("tabindex")),{once:!0})):e?.focus()}function a(t,e){t.forEach((t=>t.tabIndex=-1)),e.tabIndex=0}function d(t){t.forEach((t=>t.tabIndex=-1)),t[0].tabIndex=0}export{o as focusElement,t as focusable,n as getActiveElement,d as initializeKeyListItems,a as setActiveKeyListItem,e as simpleFocusable};
@@ -0,0 +1,11 @@
1
+ export declare function validKeyNavigationCode(e: KeyboardEvent): boolean;
2
+ export declare enum KeyNavigationCode {
3
+ ArrowUp = "ArrowUp",
4
+ ArrowDown = "ArrowDown",
5
+ ArrowLeft = "ArrowLeft",
6
+ ArrowRight = "ArrowRight",
7
+ End = "End",
8
+ Home = "Home",
9
+ PageUp = "PageUp",
10
+ PageDown = "PageDown"
11
+ }
@@ -0,0 +1 @@
1
+ function o(o){return o.code===r.ArrowUp||o.code===r.ArrowDown||o.code===r.ArrowLeft||o.code===r.ArrowRight||o.code===r.End||o.code===r.Home||o.code===r.PageUp||o.code===r.PageDown}var r;!function(o){o.ArrowUp="ArrowUp",o.ArrowDown="ArrowDown",o.ArrowLeft="ArrowLeft",o.ArrowRight="ArrowRight",o.End="End",o.Home="Home",o.PageUp="PageUp",o.PageDown="PageDown"}(r||(r={}));export{r as KeyNavigationCode,o as validKeyNavigationCode};
@@ -0,0 +1,5 @@
1
+ export declare function getFlattenedFocusableItems(element: Node, depth?: number): HTMLElement[];
2
+ export declare function getFlattenedDOMTree(node: Node, depth?: number): HTMLElement[];
3
+ export declare function getChildren(node: any): any;
4
+ export declare function isObject(val: any): boolean;
5
+ export declare function mergeObjects(...objs: object[]): object;
@@ -0,0 +1 @@
1
+ import{focusable as r}from"./focus.js";function n(n,e=10){return t(n,e).filter((n=>r(n)))}function t(r,n=10){return Array.from(e(r)).reduce(((r,o)=>[...r,[o,[...Array.from(e(o)).map((r=>[r,t(r,n)]))]]]),[]).flat(n)}function e(r){if(r.documentElement)return r.documentElement.children;if(r.shadowRoot)return r.shadowRoot.children;if(r.assignedElements){const n=r.assignedElements();return n.length?n:r.children}return r.children}function o(r){return r?.constructor===Object}function c(...r){const n={};return r.map((r=>o(r)?{...r}:{})).forEach((r=>{Object.keys(r).forEach((t=>{const e=r[t];Array.isArray(e)?n[t]=Array.from(e):o(e)?n[t]=c(n[t]||{},e):n[t]=e}))})),n}export{e as getChildren,t as getFlattenedDOMTree,n as getFlattenedFocusableItems,o as isObject,c as mergeObjects};
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@blueprintui/grid",
3
+ "version": "0.0.0",
4
+ "main": "./index.js",
5
+ "module": "./index.js",
6
+ "typings": "./index.d.ts",
7
+ "type": "module",
8
+ "files": [
9
+ "*"
10
+ ],
11
+ "customElements": "./custom-elements.json",
12
+ "keywords": [
13
+ "web component",
14
+ "datagrid",
15
+ "datatable",
16
+ "ui"
17
+ ],
18
+ "description": "",
19
+ "homepage": "https://blueprintui.dev",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://blueprintui.dev"
23
+ },
24
+ "bugs": {
25
+ "url": "https://blueprintui.dev"
26
+ },
27
+ "author": "Crylan Software",
28
+ "license": "MIT",
29
+ "sideEffects": [
30
+ "./include/*.js"
31
+ ],
32
+ "exports": {
33
+ "./package.json": "./package.json",
34
+ "./custom-elements.json": "./custom-elements.json",
35
+ ".": "./index.js",
36
+ "./include/*": "./include/*",
37
+ "./internals": "./internals/index.js",
38
+ "./*": "./*/index.js"
39
+ },
40
+ "dependencies": {
41
+ "@blueprintui/components": "^0.0.31",
42
+ "lit": "^2.5.0"
43
+ }
44
+ }
@@ -0,0 +1 @@
1
+ const e=new CSSStyleSheet;e.replaceSync('@import "./../../styles/module.tokens";[part=internal]{display:flex;gap:var(--bp-space-sm)}button{background:0 0;border:0;cursor:pointer}button[disabled]{cursor:not-allowed}');export{e as default};
@@ -0,0 +1,53 @@
1
+ import { LitElement } from 'lit';
2
+ /**
3
+ * Grid Pagination
4
+ *
5
+ * ```typescript
6
+ * import '@blueprintui/grid/include/core.js';
7
+ * ```
8
+ *
9
+ * ```html
10
+ * <bp-grid-pagination></bp-grid-pagination>
11
+ * ```
12
+ *
13
+ * @element bp-grid-pagination
14
+ * @event page
15
+ * @event size
16
+ */
17
+ export declare class BpGridPagination extends LitElement {
18
+ #private;
19
+ i18n: {
20
+ sort: string;
21
+ expand: string;
22
+ close: string;
23
+ resize: string;
24
+ filter: string;
25
+ loading: string;
26
+ show: string;
27
+ hide: string;
28
+ previous: string;
29
+ next: string;
30
+ first: string;
31
+ last: string;
32
+ today: string;
33
+ browse: string;
34
+ removeFile: string;
35
+ files: string;
36
+ resizeColumn: string;
37
+ closeDetails: string;
38
+ noData: string;
39
+ action: string;
40
+ dropTarget: string;
41
+ firstPage: string;
42
+ previousPage: string;
43
+ nextPage: string;
44
+ lastPage: string;
45
+ pageSize: string;
46
+ };
47
+ page: number;
48
+ pageSize: number;
49
+ pageCount: number;
50
+ pageSizeOptions: number[];
51
+ static styles: CSSStyleSheet[];
52
+ render(): import("lit-html").TemplateResult<1>;
53
+ }
@@ -0,0 +1 @@
1
+ import{__decorate as e}from"tslib";import{LitElement as t,html as i}from"lit";import{I18nService as a,baseStyles as s,i18n as p}from"@blueprintui/components/internals";import n from"./element.css.js";let g=class extends t{static properties={i18n:{type:Object},page:{type:Number},pageSize:{type:Number,attribute:"page-size"},pageCount:{type:Number,attribute:"page-count"},pageSizeOptions:{type:Array,attribute:"page-size-options"}};constructor(){super(...arguments);this.i18n=a.keys.actions,this.page=1,this.pageSize=10,this.pageCount=1,this.pageSizeOptions=[]}static styles=[s,n];render(){return i`<section part="internal"><bp-pagination aria-label="pagination">${this.pageSizeOptions.length?i`<bp-select .value="${this.pageSize.toString()}" .ariaLabel="${this.i18n.pageSize}" @input="${e=>this.#e(parseInt(e.target.value))}">${this.pageSizeOptions.map((e=>i`<bp-option value="${e}" ?selected="${e===this.pageSize}">${e}</bp-option>`))}</bp-select>`:""}<bp-button-icon slot="first" .ariaLabel="${this.i18n.firstPage}" .disabled="${1===this.page}" @click="${this.#t}"></bp-button-icon><bp-button-icon slot="prev" .ariaLabel="${this.i18n.previousPage}" .disabled="${1===this.page}" @click="${this.#i}"></bp-button-icon><bp-field novalidate><bp-input type="number" size="${e=this.page,1+(0|Math.log10((e^e>>31)-(e>>31)))}" min="1" value="${this.page}" max="${this.pageCount}" .ariaLabel="${`${this.page} of ${this.pageCount}`}" @input="${this.#a}"></bp-input><bp-field-message>/ ${this.pageCount}</bp-field-message></bp-field><bp-button-icon slot="next" .ariaLabel="${this.i18n.nextPage}" ?disabled="${this.page===this.pageCount}" @click="${this.#s}"></bp-button-icon><bp-button-icon slot="last" .ariaLabel="${this.i18n.lastPage}" ?disabled="${this.page===this.pageCount}" @click="${this.#p}"></bp-button-icon></bp-pagination></section>`;var e}#a(e){this.#n(e.target.valueAsNumber)}#s(){this.#n(this.page+1)}#i(){this.#n(this.page-1)}#t(){this.#n(1)}#p(){this.#n(this.pageCount)}#n(e){this.dispatchEvent(new CustomEvent("page",{detail:e}))}#e(e){this.dispatchEvent(new CustomEvent("size",{detail:e}))}};g=e([p({key:"actions"})],g);export{g as BpGridPagination};
@@ -0,0 +1 @@
1
+ const a=new CSSStyleSheet;a.replaceSync(":host{--background:var(--bp-layer-container-background);--box-shadow:none;--color:var(--bp-text-color-500);--padding:var(--bp-size-4);--gap:var(--bp-space-md);content-visibility:var(--row-content-visibility, auto);flex:1}[part=internal]{box-shadow:var(--box-shadow);padding:var(--padding);min-height:var(--bp-size-8);background:var(--background);width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:var(--gap);position:relative;grid-column:1/-1;color:var(--color);text-align:center}:host([draggable='false']) [part=internal]{min-height:var(--bp-size-10)}:host([bp-draggable*='target']){--box-shadow:inset 0 var(--bp-object-border-width-300) 0 calc(var(--bp-size-1) * -1) var(--bp-interaction-accent-background)}");export{a as default};
@@ -0,0 +1,45 @@
1
+ import { LitElement } from 'lit';
2
+ /**
3
+ * Grid Placeholder
4
+ *
5
+ * ```typescript
6
+ * import '@blueprintui/grid/include/core.js';
7
+ * ```
8
+ *
9
+ * @element bp-grid-placeholder
10
+ */
11
+ export declare class BpGridPlaceholder extends LitElement {
12
+ #private;
13
+ i18n: {
14
+ sort: string;
15
+ expand: string;
16
+ close: string;
17
+ resize: string;
18
+ filter: string;
19
+ loading: string;
20
+ show: string;
21
+ hide: string;
22
+ previous: string;
23
+ next: string;
24
+ first: string;
25
+ last: string;
26
+ today: string;
27
+ browse: string;
28
+ removeFile: string;
29
+ files: string;
30
+ resizeColumn: string;
31
+ closeDetails: string;
32
+ noData: string;
33
+ action: string;
34
+ dropTarget: string;
35
+ firstPage: string;
36
+ previousPage: string;
37
+ nextPage: string;
38
+ lastPage: string;
39
+ pageSize: string;
40
+ };
41
+ _colSpan: string;
42
+ static styles: CSSStyleSheet[];
43
+ render(): import("lit-html").TemplateResult<1>;
44
+ connectedCallback(): void;
45
+ }
@@ -0,0 +1 @@
1
+ import{__decorate as t}from"tslib";import{LitElement as e,html as r}from"lit";import{I18nService as s,baseStyles as n,i18n as i}from"@blueprintui/components/internals";import a from"./element.css.js";let o=class extends e{static properties={i18n:{type:Object},_colSpan:{state:!0}};constructor(){super(...arguments);this.i18n=s.keys.actions,this._colSpan="0"}static styles=[n,a];#t=this.attachInternals();render(){return r`<slot role="gridcell" part="internal" .ariaColSpan="${this._colSpan}">${"false"!==this.getAttribute("draggable")?r`<p>${this.i18n.noData}</p>`:r`<p sr-only>${this.i18n.dropTarget}</p>`}</slot>`}connectedCallback(){super.connectedCallback(),this.#t.role="row"}};o=t([i({key:"actions"})],o);export{o as BpGridPlaceholder};
@@ -0,0 +1 @@
1
+ const o=new CSSStyleSheet;o.replaceSync(":host{--background:var(--bp-layer-container-background);--min-height:var(--row-height);--border-top:var(--bp-object-border-width-100) solid var(--bp-object-border-color-100);--border-bottom:0;--box-shadow:none;content-visibility:var(--row-content-visibility, auto);contain-intrinsic-size:auto var(--min-height)}:host(:hover) ::slotted(bp-grid-cell){--bp-interaction-offset:var(--bp-interaction-hover-offset)}:host([selected]) ::slotted(bp-grid-cell){--bp-interaction-offset:var(--bp-interaction-selected-offset)}slot{display:grid;grid-template-columns:var(--ch-grid);box-shadow:var(--box-shadow);background:var(--background);min-height:var(--min-height);border-top:var(--border-top);border-bottom:var(--border-bottom)}:host([position='fixed']),:host([position='sticky']){--row-content-visibility:visible;--background:var(--bp-layer-container-background);--bp-interaction-offset:var(--bp-interaction-selected-offset);--border-bottom:var(--bp-object-border-width-100) solid var(--bp-object-border-color-100);z-index:99;--border-bottom:0;--box-shadow:0 var(--bp-object-border-width-200) var(--bp-object-border-width-100) -1px var(--bp-object-border-color-100);position:sticky;top:calc(var(--min-height) + var(--bp-size-1))}:host([draggable='true']){-webkit-user-drag:element;user-select:none}:host([bp-draggable*='target']){--box-shadow:inset 0 var(--bp-object-border-width-300) 0 calc(var(--bp-size-1) * -1) var(--bp-interaction-accent-background)}");export{o as default};
@@ -0,0 +1,22 @@
1
+ import { LitElement } from 'lit';
2
+ /**
3
+ * Grid Row
4
+ *
5
+ * ```typescript
6
+ * import '@blueprintui/grid/include/core.js';
7
+ * ```
8
+ *
9
+ * @element bp-grid-row
10
+ * @cssprop --border-top
11
+ * @cssprop --border-bottom
12
+ * @cssprop --background
13
+ * @cssprop --min-height
14
+ */
15
+ export declare class BpGridRow extends LitElement {
16
+ #private;
17
+ selected: boolean;
18
+ position: 'fixed' | 'sticky' | '';
19
+ static styles: CSSStyleSheet[];
20
+ render(): import("lit-html").TemplateResult<1>;
21
+ constructor();
22
+ }
package/row/element.js ADDED
@@ -0,0 +1 @@
1
+ import{LitElement as t,html as e}from"lit";import{baseStyles as r,interactionStyles as s}from"@blueprintui/components/internals";import{GridRowPositionController as o}from"./position.controller.js";import n from"./element.css.js";class i extends t{static properties={selected:{type:Boolean,reflect:!0},position:{type:String,reflect:!0}};static styles=[r,s,n];#t=this.attachInternals();render(){return e`<slot></slot>`}constructor(){super();new o(this),this.#t.role="row"}}export{i as BpGridRow};
@@ -0,0 +1,9 @@
1
+ import { ReactiveControllerHost } from 'lit';
2
+ export declare type GridRowPosition = ReactiveControllerHost & HTMLElement & {
3
+ position: '' | 'fixed' | 'sticky';
4
+ };
5
+ export declare class GridRowPositionController {
6
+ private host;
7
+ constructor(host: GridRowPosition);
8
+ hostUpdated(): void;
9
+ }
@@ -0,0 +1 @@
1
+ class t{host;constructor(t){this.host=t,this.host.addController(this)}hostUpdated(){"fixed"!==this.host.position&&"sticky"!==this.host.position||this.host.parentElement?.style.setProperty("--scroll-padding-top","calc(var(--row-height) * 2)")}}export{t as GridRowPositionController};