@lazhus/kg-ui 0.8.8 → 0.9.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.
package/README.md CHANGED
@@ -10,6 +10,7 @@ Modern, lightweight UI component library built with LitElement.
10
10
  - 📱 **Responsive** - Mobile-first design
11
11
  - ⚡ **Lightweight** - Built with LitElement
12
12
  - 🎯 **TypeScript Ready** - Full type support (Global & React/JSX)
13
+ - 📊 **Powerful DataGrid** - Server-side pagination, sorting, and custom rendering
13
14
  - ♿ **Accessible** - ARIA compliant components
14
15
 
15
16
  ## 📦 Installation
@@ -1407,13 +1407,13 @@
1407
1407
  "text": "object"
1408
1408
  },
1409
1409
  "static": true,
1410
- "default": "{ columns: { type: Array }, // [{ label: 'Name', field: 'name', width: '100px', align: 'left', sortable: true }] data: { type: Array }, loading: { type: Boolean }, striped: { type: Boolean }, bordered: { type: Boolean }, hover: { type: Boolean }, selectable: { type: Boolean }, selectionMode: { type: String, attribute: 'selection-mode' }, // 'single' | 'multiple', default 'multiple' selectedRows: { type: Array, state: true }, // Sorting sortable: { type: Boolean }, // Global sort enable/disable _sortColumn: { type: String, state: true }, _sortDirection: { type: String, state: true }, // 'asc' | 'desc' // Pagination pagination: { type: Boolean }, pageSize: { type: Number, attribute: 'page-size' }, _currentPage: { type: Number, state: true } }"
1410
+ "default": "{ columns: { type: Array }, // [{ label: 'Name', field: 'name', width: '100px', align: 'left', sortable: true }] data: { type: Array }, loading: { type: Boolean }, striped: { type: Boolean }, bordered: { type: Boolean }, hover: { type: Boolean }, selectable: { type: Boolean }, selectionMode: { type: String, attribute: 'selection-mode' }, // 'single' | 'multiple', default 'multiple' selectedRows: { type: Array, state: true }, // Sorting sortable: { type: Boolean }, // Global sort enable/disable _sortColumn: { type: String, state: true }, _sortDirection: { type: String, state: true }, // 'asc' | 'desc' // Pagination pagination: { type: Boolean }, pageSize: { type: Number, attribute: 'page-size' }, pageSizeOptions: { type: Array, attribute: 'page-size-options' }, total: { type: Number }, // Total records for server-side serverSide: { type: Boolean, attribute: 'server-side' }, currentPage: { type: Number, attribute: 'current-page' } }"
1411
1411
  },
1412
1412
  {
1413
1413
  "kind": "field",
1414
1414
  "name": "styles",
1415
1415
  "static": true,
1416
- "default": "css` :host { display: block; width: 100%; font-family: inherit; color: var(--kg-text); --datagrid-border: var(--kg-border, #e2e8f0); --datagrid-header-bg: var(--kg-surface, #f8fafc); --datagrid-selected-bg: rgba(var(--kg-primary-rgb, 65, 171, 52), 0.08); } .wrapper { display: flex; flex-direction: column; gap: 1rem; width: 100%; } .table-container { width: 100%; overflow-x: auto; border: 1px solid var(--datagrid-border); border-radius: var(--kg-radius-md, 8px); background: var(--kg-bg); } table { width: 100%; border-collapse: collapse; text-align: left; font-size: 0.9rem; } thead { background-color: var(--datagrid-header-bg); border-bottom: 2px solid var(--datagrid-border); } th { padding: 12px 16px; font-weight: 600; color: var(--kg-text-muted); white-space: nowrap; user-select: none; transition: background 0.2s; overflow: hidden; text-overflow: ellipsis; } th.sortable { cursor: pointer; } th.sortable:hover { background-color: rgba(0,0,0,0.03); color: var(--kg-text); } td { padding: 12px 16px; border-bottom: 1px solid var(--datagrid-border); transition: background 0.2s; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } tr:last-child td { border-bottom: none; } /* Modifiers */ :host([striped]) tbody tr:nth-child(even) { background-color: var(--kg-surface); } :host([bordered]) td, :host([bordered]) th { border-right: 1px solid var(--datagrid-border); } :host([bordered]) td:last-child, :host([bordered]) th:last-child { border-right: none; } tbody tr { transition: background-color 0.2s; } :host([hover]) tbody tr:hover { background-color: var(--datagrid-hover-bg, rgba(0, 0, 0, 0.04)); } /* Selection */ .checkbox-cell { width: 48px; text-align: center; padding: 0 8px; } /* kg-checkbox and kg-radio handle their own sizing and cursor */ tr.selected { background-color: var(--datagrid-selected-bg) !important; } /* Alignment */ .align-left { text-align: left; } .align-center { text-align: center; } .align-right { text-align: right; } /* Empty State */ .empty-state { padding: 3rem; text-align: center; color: var(--kg-text-muted); } /* Sort Icons */ .sort-icon { display: inline-block; margin-left: 4px; vertical-align: middle; opacity: 0.3; font-size: 0.8em; } th.sortable:hover .sort-icon { opacity: 0.7; } th.active-sort .sort-icon { opacity: 1; color: var(--kg-primary); } /* Pagination */ .pagination-footer { display: flex; align-items: center; justify-content: space-between; padding: 1rem 0; gap: 1rem; flex-wrap: wrap; border-top: 1px solid var(--datagrid-border); margin-top: -1px; /* Overlap with table border if needed, or keeping it separate */ } .pagination-info { font-size: 0.85rem; color: var(--kg-text-muted); font-weight: 500; } .pagination-controls { display: flex; align-items: center; gap: 0.25rem; } `"
1416
+ "default": "css` :host { display: block; width: 100%; font-family: inherit; color: var(--kg-text); --datagrid-border: var(--kg-border, #e2e8f0); --datagrid-header-bg: var(--kg-surface, #f8fafc); --datagrid-selected-bg: rgba(var(--kg-primary-rgb, 65, 171, 52), 0.08); } .wrapper { display: flex; flex-direction: column; gap: 1rem; width: 100%; } .table-container { width: 100%; overflow-x: auto; border: 1px solid var(--datagrid-border); border-radius: var(--kg-radius-md, 8px); background: var(--kg-bg); } table { width: 100%; border-collapse: collapse; text-align: left; font-size: 0.9rem; } thead { background-color: var(--datagrid-header-bg); border-bottom: 2px solid var(--datagrid-border); } th { padding: 12px 16px; font-weight: 600; color: var(--kg-text-muted); white-space: nowrap; user-select: none; transition: background 0.2s; overflow: hidden; text-overflow: ellipsis; } th.sortable { cursor: pointer; } th.sortable:hover { background-color: rgba(0,0,0,0.03); color: var(--kg-text); } td { padding: 12px 16px; border-bottom: 1px solid var(--datagrid-border); transition: background 0.2s; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } tr:last-child td { border-bottom: none; } /* Modifiers */ :host([striped]) tbody tr:nth-child(even) { background-color: var(--kg-surface); } :host([bordered]) td, :host([bordered]) th { border-right: 1px solid var(--datagrid-border); } :host([bordered]) td:last-child, :host([bordered]) th:last-child { border-right: none; } tbody tr { transition: background-color 0.2s; } :host([hover]) tbody tr:hover { background-color: var(--datagrid-hover-bg, rgba(0, 0, 0, 0.04)); } /* Selection */ .checkbox-cell { width: 48px; text-align: center; padding: 0 8px; } /* kg-checkbox and kg-radio handle their own sizing and cursor */ tr.selected { background-color: var(--datagrid-selected-bg) !important; } /* Alignment */ .align-left { text-align: left; } .align-center { text-align: center; } .align-right { text-align: right; } /* Empty State */ .empty-state { padding: 3rem; text-align: center; color: var(--kg-text-muted); } /* Sort Icons */ .sort-icon { display: inline-block; margin-left: 4px; vertical-align: middle; opacity: 0.3; font-size: 0.8em; } th.sortable:hover .sort-icon { opacity: 0.7; } th.active-sort .sort-icon { opacity: 1; color: var(--kg-primary); } /* Pagination */ .pagination-footer { display: flex; align-items: center; justify-content: space-between; padding: 1rem 0; gap: 1rem; flex-wrap: wrap; border-top: 1px solid var(--datagrid-border); margin-top: -1px; /* Overlap with table border if needed, or keeping it separate */ } .pagination-info { font-size: 0.85rem; color: var(--kg-text-muted); font-weight: 500; } .pagination-controls { display: flex; align-items: center; gap: 0.25rem; } .page-size-selector { display: flex; align-items: center; gap: 0.5rem; font-size: 0.85rem; color: var(--kg-text-muted); } .page-size-select { padding: 4px 8px; border: 1px solid var(--datagrid-border); border-radius: var(--kg-radius-sm, 4px); background: var(--kg-surface); color: var(--kg-text); outline: none; cursor: pointer; } `"
1417
1417
  },
1418
1418
  {
1419
1419
  "kind": "method",
@@ -1471,6 +1471,15 @@
1471
1471
  }
1472
1472
  ]
1473
1473
  },
1474
+ {
1475
+ "kind": "method",
1476
+ "name": "_handlePageSizeChange",
1477
+ "parameters": [
1478
+ {
1479
+ "name": "e"
1480
+ }
1481
+ ]
1482
+ },
1474
1483
  {
1475
1484
  "kind": "method",
1476
1485
  "name": "_renderCellContent",
@@ -1594,7 +1603,31 @@
1594
1603
  },
1595
1604
  {
1596
1605
  "kind": "field",
1597
- "name": "_currentPage",
1606
+ "name": "pageSizeOptions",
1607
+ "type": {
1608
+ "text": "array"
1609
+ },
1610
+ "default": "[10, 20, 50, 100]"
1611
+ },
1612
+ {
1613
+ "kind": "field",
1614
+ "name": "total",
1615
+ "type": {
1616
+ "text": "number"
1617
+ },
1618
+ "default": "0"
1619
+ },
1620
+ {
1621
+ "kind": "field",
1622
+ "name": "serverSide",
1623
+ "type": {
1624
+ "text": "boolean"
1625
+ },
1626
+ "default": "false"
1627
+ },
1628
+ {
1629
+ "kind": "field",
1630
+ "name": "currentPage",
1598
1631
  "type": {
1599
1632
  "text": "number"
1600
1633
  },
@@ -1635,6 +1668,12 @@
1635
1668
  "type": {
1636
1669
  "text": "CustomEvent"
1637
1670
  }
1671
+ },
1672
+ {
1673
+ "name": "page-size-change",
1674
+ "type": {
1675
+ "text": "CustomEvent"
1676
+ }
1638
1677
  }
1639
1678
  ],
1640
1679
  "superclass": {
@@ -5307,7 +5346,7 @@
5307
5346
  "kind": "field",
5308
5347
  "name": "styles",
5309
5348
  "static": true,
5310
- "default": "css` :host { display: inline-block; vertical-align: middle; cursor: pointer; user-select: none; font-family: inherit; } :host([disabled]) { cursor: not-allowed; opacity: 0.5; } .kg-switch-wrapper { display: flex; align-items: center; gap: 0.75rem; } .kg-switch-track { position: relative; width: 44px; height: 24px; background: var(--kg-border); border-radius: 24px; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); box-shadow: inset 0 2px 4px rgba(0,0,0,0.05); } .kg-switch-thumb { position: absolute; top: 2px; left: 2px; width: 20px; height: 20px; background: white; border-radius: 50%; box-shadow: 0 2px 4px rgba(0,0,0,0.2); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } /* Checked State */ :host([checked]) .kg-switch-track { background: var(--switch-active-color, var(--kg-primary)); } :host([checked]) .kg-switch-thumb { transform: translateX(20px); .label { font-size: 0.95rem; font-weight: 500; color: var(--kg-text); } .error-text { position: absolute; top: 100%; left: 2px; color: #DB2828; font-size: 0.75rem; margin-top: 4px; font-weight: 500; animation: fadeIn 0.2s ease-in; white-space: nowrap; } .error .kg-switch-track { box-shadow: 0 0 0 2px rgba(219, 40, 40, 0.2); } @keyframes fadeIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } } `"
5349
+ "default": "css` :host { display: inline-block; vertical-align: middle; cursor: pointer; user-select: none; font-family: inherit; } :host([disabled]) { cursor: not-allowed; opacity: 0.5; } .kg-switch-wrapper { display: flex; align-items: center; gap: 0.75rem; } .kg-switch-track { position: relative; width: 44px; height: 24px; background: var(--kg-border); border-radius: 24px; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); box-shadow: inset 0 2px 4px rgba(0,0,0,0.05); } .kg-switch-thumb { position: absolute; top: 2px; left: 2px; width: 20px; height: 20px; background: white; border-radius: 50%; box-shadow: 0 2px 4px rgba(0,0,0,0.2); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } /* Checked State */ :host([checked]) .kg-switch-track { background: var(--switch-active-color, var(--kg-primary)); } :host([checked]) .kg-switch-thumb { transform: translateX(20px); } .label { font-size: 0.95rem; font-weight: 500; color: var(--kg-text); } .error-text { position: absolute; top: 100%; left: 2px; color: #DB2828; font-size: 0.75rem; margin-top: 4px; font-weight: 500; animation: fadeIn 0.2s ease-in; white-space: nowrap; } .error .kg-switch-track { box-shadow: 0 0 0 2px rgba(219, 40, 40, 0.2); } @keyframes fadeIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } } `"
5311
5350
  },
5312
5351
  {
5313
5352
  "kind": "method",
@@ -5375,6 +5414,30 @@
5375
5414
  },
5376
5415
  "default": "'primary'"
5377
5416
  },
5417
+ {
5418
+ "kind": "field",
5419
+ "name": "label",
5420
+ "type": {
5421
+ "text": "string"
5422
+ },
5423
+ "default": "''"
5424
+ },
5425
+ {
5426
+ "kind": "field",
5427
+ "name": "leftLabel",
5428
+ "type": {
5429
+ "text": "string"
5430
+ },
5431
+ "default": "''"
5432
+ },
5433
+ {
5434
+ "kind": "field",
5435
+ "name": "rightLabel",
5436
+ "type": {
5437
+ "text": "string"
5438
+ },
5439
+ "default": "''"
5440
+ },
5378
5441
  {
5379
5442
  "kind": "field",
5380
5443
  "name": "value",
@@ -1,28 +1,28 @@
1
- var e=Object.defineProperty,t=(t,i,r)=>((t,i,r)=>i in t?e(t,i,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[i]=r)(t,"symbol"!=typeof i?i+"":i,r);import{LitElement as i,css as r,html as o}from"lit";import"lit/directives/class-map.js";import"./kg-checkbox.js";import"./kg-radio.js";import{unsafeHTML as s}from"lit/directives/unsafe-html.js";import"./kg-button.js";import"./kg-skeleton.js";class a extends i{constructor(){super(),this.columns=[],this.data=[],this.loading=!1,this.striped=!1,this.bordered=!1,this.hover=!0,this.selectable=!1,this.selectionMode="multiple",this.selectedRows=[],this.sortable=!1,this.pagination=!1,this.pageSize=10,this._currentPage=1,this._sortColumn=null,this._sortDirection=null}_handleSelectAll(e){if(!this.selectable||"single"===this.selectionMode)return;const t=e.detail.checked;this.selectedRows=t?[...this.data]:[],this._emitSelectionChange()}_handleRowSelect(e,t){if(this.selectable)if(t.stopPropagation(),"single"===this.selectionMode)this._isSelected(e)||(this.selectedRows=[e],this._emitSelectionChange());else{let i;i="change"===t.type&&void 0!==t.detail&&void 0!==t.detail.checked?t.detail.checked:!this._isSelected(e),this.selectedRows=i?[...this.selectedRows,e]:this.selectedRows.filter(t=>t!==e),this._emitSelectionChange()}}_isSelected(e){return this.selectedRows.includes(e)}_emitSelectionChange(){this.dispatchEvent(new CustomEvent("selection-change",{detail:{selectedRows:this.selectedRows},bubbles:!0,composed:!0}))}_handleSort(e){(e.sortable||this.sortable)&&(this._sortColumn===e.field?this._sortDirection="asc"===this._sortDirection?"desc":"asc":(this._sortColumn=e.field,this._sortDirection="asc"),this.dispatchEvent(new CustomEvent("sort",{detail:{column:this._sortColumn,direction:this._sortDirection},bubbles:!0,composed:!0})))}_getProcessedData(){let e=[...this.data];if(this._sortColumn&&e.sort((e,t)=>{const i=e[this._sortColumn],r=t[this._sortColumn];return i<r?"asc"===this._sortDirection?-1:1:i>r?"asc"===this._sortDirection?1:-1:0}),this.pagination){const t=(this._currentPage-1)*this.pageSize,i=t+this.pageSize;return{data:e.slice(t,i),total:e.length}}return{data:e,total:e.length}}_changePage(e){if(e<1)return;const t=this.data.length;e>Math.ceil(t/this.pageSize)||(this._currentPage=e,this.dispatchEvent(new CustomEvent("page-change",{detail:{page:this._currentPage,pageSize:this.pageSize},bubbles:!0,composed:!0})))}_renderCellContent(e,t){if(!e.render)return t[e.field];const i=e.render(t);return"string"==typeof i?s(i):i}_renderHeaderContent(e){if(e.headerRender){const t=e.headerRender(e);return"string"==typeof t?s(t):t}return e.label}render(){const{data:e,total:t}=this._getProcessedData(),i=this.pagination?Math.ceil(t/this.pageSize):1,r=this.data.length>0&&this.selectedRows.length===this.data.length,s="single"===this.selectionMode;return o`
1
+ var e=Object.defineProperty,t=(t,i,s)=>((t,i,s)=>i in t?e(t,i,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[i]=s)(t,"symbol"!=typeof i?i+"":i,s);import{LitElement as i,css as s,html as a}from"lit";import"lit/directives/class-map.js";import"./kg-checkbox.js";import"./kg-radio.js";import{unsafeHTML as r}from"lit/directives/unsafe-html.js";import"./kg-button.js";import"./kg-skeleton.js";class o extends i{constructor(){super(),this.columns=[],this.data=[],this.loading=!1,this.striped=!1,this.bordered=!1,this.hover=!0,this.selectable=!1,this.selectionMode="multiple",this.selectedRows=[],this.sortable=!1,this.pagination=!1,this.pageSize=10,this.pageSizeOptions=[10,20,50,100],this.total=0,this.serverSide=!1,this.currentPage=1,this._sortColumn=null,this._sortDirection=null}_handleSelectAll(e){if(!this.selectable||"single"===this.selectionMode)return;const t=e.detail.checked;this.selectedRows=t?[...this.data]:[],this._emitSelectionChange()}_handleRowSelect(e,t){if(this.selectable)if(t.stopPropagation(),"single"===this.selectionMode)this._isSelected(e)||(this.selectedRows=[e],this._emitSelectionChange());else{let i;i="change"===t.type&&void 0!==t.detail&&void 0!==t.detail.checked?t.detail.checked:!this._isSelected(e),this.selectedRows=i?[...this.selectedRows,e]:this.selectedRows.filter(t=>t!==e),this._emitSelectionChange()}}_isSelected(e){return this.selectedRows.includes(e)}_emitSelectionChange(){this.dispatchEvent(new CustomEvent("selection-change",{detail:{selectedRows:this.selectedRows},bubbles:!0,composed:!0}))}_handleSort(e){(e.sortable||this.sortable)&&(this._sortColumn===e.field?this._sortDirection="asc"===this._sortDirection?"desc":"asc":(this._sortColumn=e.field,this._sortDirection="asc"),this.dispatchEvent(new CustomEvent("sort",{detail:{column:this._sortColumn,direction:this._sortDirection},bubbles:!0,composed:!0})))}_getProcessedData(){if(this.serverSide)return{data:this.data,total:this.total||this.data.length};let e=[...this.data];if(this._sortColumn&&e.sort((e,t)=>{const i=e[this._sortColumn],s=t[this._sortColumn];return i<s?"asc"===this._sortDirection?-1:1:i>s?"asc"===this._sortDirection?1:-1:0}),this.pagination){const t=(this.currentPage-1)*this.pageSize,i=t+this.pageSize;return{data:e.slice(t,i),total:e.length}}return{data:e,total:e.length}}_changePage(e){if(e<1)return;const t=this.serverSide&&this.total||this.data.length;e>Math.ceil(t/this.pageSize)||(this.currentPage=e,this.dispatchEvent(new CustomEvent("page-change",{detail:{page:this.currentPage,pageSize:this.pageSize},bubbles:!0,composed:!0})))}_handlePageSizeChange(e){const t=parseInt(e.target.value);this.pageSize=t,this.currentPage=1,this.dispatchEvent(new CustomEvent("page-size-change",{detail:{pageSize:t,page:1},bubbles:!0,composed:!0})),this.dispatchEvent(new CustomEvent("page-change",{detail:{page:1,pageSize:t},bubbles:!0,composed:!0}))}_renderCellContent(e,t){if(!e.render)return t[e.field];const i=e.render(t);return"string"==typeof i?r(i):i}_renderHeaderContent(e){if(e.headerRender){const t=e.headerRender(e);return"string"==typeof t?r(t):t}return e.label}render(){const{data:e,total:t}=this._getProcessedData(),i=this.pagination?Math.ceil(t/this.pageSize):1,s=this.data.length>0&&this.selectedRows.length===this.data.length,r="single"===this.selectionMode,o=(()=>{const e=[],t=this.currentPage-2,s=this.currentPage+2+1;for(let a=1;a<=i;a++)(1===a||a===i||a>=t&&a<s)&&e.push(a);return e})();return a`
2
2
  <div class="wrapper">
3
3
  <div class="table-container">
4
4
  <table>
5
5
  <thead>
6
6
  <tr>
7
- ${this.selectable?o`
7
+ ${this.selectable?a`
8
8
  <th class="checkbox-cell">
9
- ${s?"":o`
9
+ ${r?"":a`
10
10
  <kg-checkbox
11
- .checked="${r}"
11
+ .checked="${s}"
12
12
  @change="${this._handleSelectAll}"
13
13
  ></kg-checkbox>
14
14
  `}
15
15
  </th>
16
16
  `:""}
17
17
 
18
- ${this.columns.map(e=>o`
18
+ ${this.columns.map(e=>a`
19
19
  <th
20
20
  class="${e.sortable||this.sortable?"sortable":""} ${e.align?`align-${e.align}`:""} ${this._sortColumn===e.field?"active-sort":""}"
21
21
  style="${e.width?`width: ${e.width}; min-width: ${e.width}; max-width: ${e.width};`:""}"
22
22
  @click="${()=>this._handleSort(e)}"
23
23
  >
24
24
  ${this._renderHeaderContent(e)}
25
- ${e.sortable||this.sortable?o`
25
+ ${e.sortable||this.sortable?a`
26
26
  <span class="sort-icon">
27
27
  ${this._sortColumn===e.field?"asc"===this._sortDirection?"▲":"▼":"⇅"}
28
28
  </span>
@@ -32,40 +32,40 @@ var e=Object.defineProperty,t=(t,i,r)=>((t,i,r)=>i in t?e(t,i,{enumerable:!0,con
32
32
  </tr>
33
33
  </thead>
34
34
  <tbody>
35
- ${this.loading?o`
36
- ${Array.from({length:this.pagination&&this.pageSize?this.pageSize:5}).map(()=>o`
35
+ ${this.loading?a`
36
+ ${Array.from({length:this.pagination&&this.pageSize?this.pageSize:5}).map(()=>a`
37
37
  <tr>
38
- ${this.selectable?o`
38
+ ${this.selectable?a`
39
39
  <td class="checkbox-cell">
40
40
  <kg-skeleton variant="rect" width="16px" height="16px" style="border-radius: 4px; display: inline-block;"></kg-skeleton>
41
41
  </td>
42
42
  `:""}
43
- ${this.columns.map(()=>o`
43
+ ${this.columns.map(()=>a`
44
44
  <td>
45
45
  <kg-skeleton variant="text" width="${Math.floor(50*Math.random()+40)}%" height="1rem"></kg-skeleton>
46
46
  </td>
47
47
  `)}
48
48
  </tr>
49
49
  `)}
50
- `:0===e.length?o`
50
+ `:0===e.length?a`
51
51
  <tr>
52
52
  <td colspan="${this.columns.length+(this.selectable?1:0)}" class="empty-state">
53
53
  Veri bulunamadı.
54
54
  </td>
55
55
  </tr>
56
- `:e.map(e=>o`
56
+ `:e.map(e=>a`
57
57
  <tr
58
58
  class="${this._isSelected(e)?"selected":""}"
59
59
  @click="${t=>this._handleRowSelect(e,t)}"
60
60
  >
61
- ${this.selectable?o`
61
+ ${this.selectable?a`
62
62
  <td class="checkbox-cell">
63
- ${s?o`
63
+ ${r?a`
64
64
  <kg-radio
65
65
  .checked="${this._isSelected(e)}"
66
66
  style="pointer-events: none;"
67
67
  ></kg-radio>
68
- `:o`
68
+ `:a`
69
69
  <kg-checkbox
70
70
  .checked="${this._isSelected(e)}"
71
71
  @change="${t=>this._handleRowSelect(e,t)}"
@@ -75,7 +75,7 @@ var e=Object.defineProperty,t=(t,i,r)=>((t,i,r)=>i in t?e(t,i,{enumerable:!0,con
75
75
  </td>
76
76
  `:""}
77
77
 
78
- ${this.columns.map(t=>o`
78
+ ${this.columns.map(t=>a`
79
79
  <td class="${t.align?`align-${t.align}`:""}">
80
80
  ${this._renderCellContent(t,e)}
81
81
  </td>
@@ -86,15 +86,27 @@ var e=Object.defineProperty,t=(t,i,r)=>((t,i,r)=>i in t?e(t,i,{enumerable:!0,con
86
86
  </table>
87
87
  </div>
88
88
 
89
- ${this.pagination&&t>0?o`
89
+ ${this.pagination&&t>0?a`
90
90
  <div class="pagination-footer">
91
- <div class="pagination-info">
92
- Toplam <strong>${t}</strong> kayıttan <strong>${(this._currentPage-1)*this.pageSize+1} - ${Math.min(this._currentPage*this.pageSize,t)}</strong> arası gösteriliyor
91
+ <div style="display: flex; align-items: center; gap: 1.5rem; flex-wrap: wrap;">
92
+ <div class="pagination-info">
93
+ Toplam <strong>${t}</strong> kayıttan <strong>${(this.currentPage-1)*this.pageSize+1} - ${Math.min(this.currentPage*this.pageSize,t)}</strong> arası gösteriliyor
94
+ </div>
95
+
96
+ <div class="page-size-selector">
97
+ <span>Sayfa başına:</span>
98
+ <select class="page-size-select" @change="${this._handlePageSizeChange}">
99
+ ${this.pageSizeOptions.map(e=>a`
100
+ <option value="${e}" ?selected="${this.pageSize===e}">${e}</option>
101
+ `)}
102
+ </select>
103
+ </div>
93
104
  </div>
105
+
94
106
  <div class="pagination-controls">
95
107
  <!-- First Page -->
96
108
  <kg-button
97
- ?disabled="${1===this._currentPage}"
109
+ ?disabled="${1===this.currentPage}"
98
110
  @click="${()=>this._changePage(1)}"
99
111
  text
100
112
  color="secondary"
@@ -106,8 +118,8 @@ var e=Object.defineProperty,t=(t,i,r)=>((t,i,r)=>i in t?e(t,i,{enumerable:!0,con
106
118
 
107
119
  <!-- Previous Page -->
108
120
  <kg-button
109
- ?disabled="${1===this._currentPage}"
110
- @click="${()=>this._changePage(this._currentPage-1)}"
121
+ ?disabled="${1===this.currentPage}"
122
+ @click="${()=>this._changePage(this.currentPage-1)}"
111
123
  text
112
124
  color="secondary"
113
125
  size="medium"
@@ -117,11 +129,12 @@ var e=Object.defineProperty,t=(t,i,r)=>((t,i,r)=>i in t?e(t,i,{enumerable:!0,con
117
129
  </kg-button>
118
130
 
119
131
  <!-- Page Numbers -->
120
- ${Array.from({length:i},(e,t)=>t+1).map(e=>o`
132
+ ${o.map((e,t)=>a`
133
+ ${t>0&&e-o[t-1]>1?a`<span class="pagination-info">...</span>`:""}
121
134
  <kg-button
122
135
  @click="${()=>this._changePage(e)}"
123
- color="${this._currentPage===e?"primary":"secondary"}"
124
- ?text="${this._currentPage!==e}"
136
+ color="${this.currentPage===e?"primary":"secondary"}"
137
+ ?text="${this.currentPage!==e}"
125
138
  size="medium"
126
139
  square
127
140
  >
@@ -131,8 +144,8 @@ var e=Object.defineProperty,t=(t,i,r)=>((t,i,r)=>i in t?e(t,i,{enumerable:!0,con
131
144
 
132
145
  <!-- Next Page -->
133
146
  <kg-button
134
- ?disabled="${this._currentPage===i}"
135
- @click="${()=>this._changePage(this._currentPage+1)}"
147
+ ?disabled="${this.currentPage===i}"
148
+ @click="${()=>this._changePage(this.currentPage+1)}"
136
149
  text
137
150
  color="secondary"
138
151
  size="medium"
@@ -143,7 +156,7 @@ var e=Object.defineProperty,t=(t,i,r)=>((t,i,r)=>i in t?e(t,i,{enumerable:!0,con
143
156
 
144
157
  <!-- Last Page -->
145
158
  <kg-button
146
- ?disabled="${this._currentPage===i}"
159
+ ?disabled="${this.currentPage===i}"
147
160
  @click="${()=>this._changePage(i)}"
148
161
  text
149
162
  color="secondary"
@@ -156,7 +169,7 @@ var e=Object.defineProperty,t=(t,i,r)=>((t,i,r)=>i in t?e(t,i,{enumerable:!0,con
156
169
  </div>
157
170
  `:""}
158
171
  </div>
159
- `}}t(a,"properties",{columns:{type:Array},data:{type:Array},loading:{type:Boolean},striped:{type:Boolean},bordered:{type:Boolean},hover:{type:Boolean},selectable:{type:Boolean},selectionMode:{type:String,attribute:"selection-mode"},selectedRows:{type:Array,state:!0},sortable:{type:Boolean},_sortColumn:{type:String,state:!0},_sortDirection:{type:String,state:!0},pagination:{type:Boolean},pageSize:{type:Number,attribute:"page-size"},_currentPage:{type:Number,state:!0}}),t(a,"styles",r`
172
+ `}}t(o,"properties",{columns:{type:Array},data:{type:Array},loading:{type:Boolean},striped:{type:Boolean},bordered:{type:Boolean},hover:{type:Boolean},selectable:{type:Boolean},selectionMode:{type:String,attribute:"selection-mode"},selectedRows:{type:Array,state:!0},sortable:{type:Boolean},_sortColumn:{type:String,state:!0},_sortDirection:{type:String,state:!0},pagination:{type:Boolean},pageSize:{type:Number,attribute:"page-size"},pageSizeOptions:{type:Array,attribute:"page-size-options"},total:{type:Number},serverSide:{type:Boolean,attribute:"server-side"},currentPage:{type:Number,attribute:"current-page"}}),t(o,"styles",s`
160
173
  :host {
161
174
  display: block;
162
175
  width: 100%;
@@ -315,5 +328,23 @@ var e=Object.defineProperty,t=(t,i,r)=>((t,i,r)=>i in t?e(t,i,{enumerable:!0,con
315
328
  gap: 0.25rem;
316
329
  }
317
330
 
331
+ .page-size-selector {
332
+ display: flex;
333
+ align-items: center;
334
+ gap: 0.5rem;
335
+ font-size: 0.85rem;
336
+ color: var(--kg-text-muted);
337
+ }
338
+
339
+ .page-size-select {
340
+ padding: 4px 8px;
341
+ border: 1px solid var(--datagrid-border);
342
+ border-radius: var(--kg-radius-sm, 4px);
343
+ background: var(--kg-surface);
344
+ color: var(--kg-text);
345
+ outline: none;
346
+ cursor: pointer;
347
+ }
348
+
318
349
 
319
- `),"undefined"==typeof customElements||customElements.get("kg-datagrid")||customElements.define("kg-datagrid",a);export{a as kgdatagrid};
350
+ `),"undefined"==typeof customElements||customElements.get("kg-datagrid")||customElements.define("kg-datagrid",o);export{o as kgdatagrid};
@@ -1,14 +1,15 @@
1
- var e,t=Object.defineProperty;import{LitElement as r,css as s,html as i}from"lit";import"lit/directives/class-map.js";import{F as a}from"../chunks/FormAssociated-Cx5D8YQA.js";class c extends(a(r)){static get properties(){return{...super.properties,checked:{type:Boolean,reflect:!0},label:{type:String},color:{type:String}}}constructor(){super(),this.checked=!1,this.color="primary",this.value="on"}formResetCallback(){this.checked=this.hasAttribute("checked"),this._updateFormValue()}formStateRestoreCallback(e){"checked"===e?this.checked=!0:"unchecked"===e&&(this.checked=!1),this._updateFormValue()}updated(e){e.has("checked")&&this._updateFormValue(),super.updated(e)}_updateFormValue(){const e=this.checked?this.value||"on":null;this.internals.setFormValue(e,this.checked?"checked":"unchecked")}_toggle(){this.disabled||(this.checked=!this.checked,this.dispatchEvent(new CustomEvent("change",{detail:{checked:this.checked},bubbles:!0,composed:!0})))}render(){const e=(r=this.color)&&"primary"!==r?r.startsWith("#")||r.startsWith("rgb")||r.startsWith("hsl")?r:{secondary:"var(--kg-secondary)",tertiary:"var(--kg-tertiary)",error:"#e74c3c",red:"#e74c3c",green:"#2ecc71",blue:"#3498db",orange:"#f39c12",purple:"#9b59b6"}[r]||`var(--kg-${r}, ${r})`:"var(--kg-primary)",t=this.checked?`--switch-active-color: ${e};`:"";var r;return i`
1
+ var e,t=Object.defineProperty;import{LitElement as r,css as s,html as i}from"lit";import"lit/directives/class-map.js";import{F as a}from"../chunks/FormAssociated-Cx5D8YQA.js";class c extends(a(r)){static get properties(){return{...super.properties,checked:{type:Boolean,reflect:!0},label:{type:String},leftLabel:{type:String},rightLabel:{type:String},color:{type:String}}}constructor(){super(),this.checked=!1,this.color="primary",this.label="",this.leftLabel="",this.rightLabel="",this.value="on"}formResetCallback(){this.checked=this.hasAttribute("checked"),this._updateFormValue()}formStateRestoreCallback(e){"checked"===e?this.checked=!0:"unchecked"===e&&(this.checked=!1),this._updateFormValue()}updated(e){e.has("checked")&&this._updateFormValue(),super.updated(e)}_updateFormValue(){const e=this.checked?this.value||"on":null;this.internals.setFormValue(e,this.checked?"checked":"unchecked")}_toggle(){this.disabled||(this.checked=!this.checked,this.dispatchEvent(new CustomEvent("change",{detail:{checked:this.checked},bubbles:!0,composed:!0})))}render(){const e=(r=this.color)&&"primary"!==r?r.startsWith("#")||r.startsWith("rgb")||r.startsWith("hsl")?r:{secondary:"var(--kg-secondary)",tertiary:"var(--kg-tertiary)",error:"#e74c3c",red:"#e74c3c",green:"#2ecc71",blue:"#3498db",orange:"#f39c12",purple:"#9b59b6"}[r]||`var(--kg-${r}, ${r})`:"var(--kg-primary)",t=this.checked?`--switch-active-color: ${e};`:"";var r;return i`
2
2
  <div style="position: relative; display: inline-block;">
3
3
  <div
4
4
  class="kg-switch-wrapper ${this.errorText?"error":""}"
5
5
  style="${t}"
6
6
  @click="${this._toggle}"
7
7
  >
8
+ ${this.leftLabel?i`<span class="label left-label">${this.leftLabel}</span>`:""}
8
9
  <div class="kg-switch-track">
9
10
  <div class="kg-switch-thumb"></div>
10
11
  </div>
11
- ${this.label?i`<span class="label">${this.label}</span>`:""}
12
+ ${this.rightLabel||this.label?i`<span class="label right-label">${this.rightLabel||this.label}</span>`:""}
12
13
  </div>
13
14
  ${this.errorText?i`<div class="error-text">${this.errorText}</div>`:""}
14
15
  </div>
@@ -61,6 +62,8 @@ var e,t=Object.defineProperty;import{LitElement as r,css as s,html as i}from"lit
61
62
 
62
63
  :host([checked]) .kg-switch-thumb {
63
64
  transform: translateX(20px);
65
+ }
66
+
64
67
  .label {
65
68
  font-size: 0.95rem;
66
69
  font-weight: 500;
@@ -1 +1 @@
1
- import e,{useState as t,useRef as r,useMemo as n,useEffect as a}from"react";import{createPortal as o}from"react-dom";import{o as c}from"../chunks/create-component-jQ1kjF1Z.js";import{kgdatagrid as s}from"../components/kg-datagrid.js";"undefined"==typeof customElements||customElements.get("kg-datagrid")||customElements.define("kg-datagrid",s);const l=c({tagName:"kg-datagrid",elementClass:s,react:e,events:{onSelectionChange:"selection-change",onPageChange:"page-change",onSort:"sort"}}),m=({columns:c,...s})=>{const[m,i]=t(/* @__PURE__ */new Map),d=r(null),u=r(/* @__PURE__ */new WeakMap),g=n(()=>c?c.map(t=>t.render?{...t,render:r=>{const n=t.render(r);if(!e.isValidElement(n))return n;let a=u.current.get(r);a||(a=/* @__PURE__ */new Map,u.current.set(r,a));let o=a.get(t.field);return o||(o=document.createElement("div"),o.className="kg-react-cell-portal",o.style.display="contents",o.dataset.reactCellId=Math.random().toString(36).substr(2,9),a.set(t.field,o)),o._reactContent=n,o}}:t):[],[c]);return a(()=>{const e=d.current;if(!e)return;const t=e.shadowRoot||e,r=()=>{const e=t.querySelectorAll(".kg-react-cell-portal"),r=/* @__PURE__ */new Map;e.forEach(e=>{e._reactContent&&r.set(e,e._reactContent)}),i(e=>{if(e.size!==r.size)return r;for(const[t,n]of r)if(e.get(t)!==n)return r;return e})},n=new MutationObserver(()=>{r()});return n.observe(t,{childList:!0,subtree:!0,attributes:!1,characterData:!1}),r(),()=>n.disconnect()},[g,s.data]),e.createElement(e.Fragment,null,e.createElement(l,{ref:d,columns:g,...s}),Array.from(m.entries()).map(([e,t])=>o(t,e,e.dataset.reactCellId)))};export{m as KgDataGrid};
1
+ import e,{useState as t,useRef as r,useMemo as n,useEffect as a}from"react";import{createPortal as o}from"react-dom";import{o as c}from"../chunks/create-component-jQ1kjF1Z.js";import{kgdatagrid as s}from"../components/kg-datagrid.js";"undefined"==typeof customElements||customElements.get("kg-datagrid")||customElements.define("kg-datagrid",s);const l=c({tagName:"kg-datagrid",elementClass:s,react:e,events:{onSelectionChange:"selection-change",onPageChange:"page-change",onPageSizeChange:"page-size-change",onSort:"sort"}}),i=({columns:c,...s})=>{const[i,m]=t(/* @__PURE__ */new Map),d=r(null),g=r(/* @__PURE__ */new WeakMap),u=n(()=>c?c.map(t=>t.render?{...t,render:r=>{const n=t.render(r);if(!e.isValidElement(n))return n;let a=g.current.get(r);a||(a=/* @__PURE__ */new Map,g.current.set(r,a));let o=a.get(t.field);return o||(o=document.createElement("div"),o.className="kg-react-cell-portal",o.style.display="contents",o.dataset.reactCellId=Math.random().toString(36).substr(2,9),a.set(t.field,o)),o._reactContent=n,o}}:t):[],[c]);return a(()=>{const e=d.current;if(!e)return;const t=e.shadowRoot||e,r=()=>{const e=t.querySelectorAll(".kg-react-cell-portal"),r=/* @__PURE__ */new Map;e.forEach(e=>{e._reactContent&&r.set(e,e._reactContent)}),m(e=>{if(e.size!==r.size)return r;for(const[t,n]of r)if(e.get(t)!==n)return r;return e})},n=new MutationObserver(()=>{r()});return n.observe(t,{childList:!0,subtree:!0,attributes:!1,characterData:!1}),r(),()=>n.disconnect()},[u,s.data]),e.createElement(e.Fragment,null,e.createElement(l,{ref:d,columns:u,...s}),Array.from(i.entries()).map(([e,t])=>o(t,e,e.dataset.reactCellId)))};export{i as KgDataGrid};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lazhus/kg-ui",
3
- "version": "0.8.8",
3
+ "version": "0.9.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist",
@@ -26,6 +26,14 @@ export class kgdatagrid extends LitElement {
26
26
  pagination: boolean;
27
27
  /** */
28
28
  pageSize: number;
29
+ /** */
30
+ pageSizeOptions: any[];
31
+ /** */
32
+ total: number;
33
+ /** */
34
+ serverSide: boolean;
35
+ /** */
36
+ currentPage: number;
29
37
  }
30
38
 
31
39
  declare global {
@@ -48,9 +56,14 @@ declare global {
48
56
  sortable?: boolean;
49
57
  pagination?: boolean;
50
58
  pageSize?: number;
59
+ pageSizeOptions?: any[];
60
+ total?: number;
61
+ serverSide?: boolean;
62
+ currentPage?: number;
51
63
  onSelectionChange?: (e: any) => void;
52
64
  onSort?: (e: any) => void;
53
65
  onPageChange?: (e: any) => void;
66
+ onPageSizeChange?: (e: any) => void;
54
67
  [key: string]: any;
55
68
  };
56
69
  }
@@ -17,6 +17,12 @@ export class kgswitch extends LitElement {
17
17
  /** */
18
18
  color: string;
19
19
  /** */
20
+ label: string;
21
+ /** */
22
+ leftLabel: string;
23
+ /** */
24
+ rightLabel: string;
25
+ /** */
20
26
  form: any;
21
27
  /** */
22
28
  type: string;
@@ -37,6 +43,9 @@ declare global {
37
43
  errorText?: string;
38
44
  checked?: boolean;
39
45
  color?: string;
46
+ label?: string;
47
+ leftLabel?: string;
48
+ rightLabel?: string;
40
49
  form?: any;
41
50
  type?: string;
42
51
  onChange?: (e: any) => void;
package/types/index.d.ts CHANGED
@@ -198,9 +198,14 @@ declare global {
198
198
  sortable?: boolean;
199
199
  pagination?: boolean;
200
200
  pageSize?: number;
201
+ pageSizeOptions?: any[];
202
+ total?: number;
203
+ serverSide?: boolean;
204
+ currentPage?: number;
201
205
  onSelectionChange?: (e: any) => void;
202
206
  onSort?: (e: any) => void;
203
207
  onPageChange?: (e: any) => void;
208
+ onPageSizeChange?: (e: any) => void;
204
209
  [key: string]: any;
205
210
  };
206
211
  'kg-datepicker': {
@@ -424,6 +429,9 @@ declare global {
424
429
  errorText?: string;
425
430
  checked?: boolean;
426
431
  color?: string;
432
+ label?: string;
433
+ leftLabel?: string;
434
+ rightLabel?: string;
427
435
  form?: any;
428
436
  type?: string;
429
437
  onChange?: (e: any) => void;