ngx-pk-ui 0.0.1 → 1.0.1

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
@@ -4,6 +4,10 @@ Angular 21 UI component library and CSS utilities.
4
4
 
5
5
  License: MIT
6
6
 
7
+ Repository: https://github.com/superpck/ngx-pk-ui
8
+
9
+ Demo & Usage: https://superpck.github.io/ngx-pk-ui/
10
+
7
11
  Source path:
8
12
 
9
13
  - `projects/ngx-pk-ui/src/lib` for components
@@ -1829,6 +1829,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1829
1829
 
1830
1830
  class PkTreeviewNodeComponent {
1831
1831
  nodes = [];
1832
+ rootNodes = [];
1832
1833
  selection = 'none';
1833
1834
  nodeToggled = new EventEmitter();
1834
1835
  selectionChanged = new EventEmitter();
@@ -1848,14 +1849,15 @@ class PkTreeviewNodeComponent {
1848
1849
  onCheckClick(node, e) {
1849
1850
  e.stopPropagation();
1850
1851
  if (this.selection === 'single') {
1851
- this.clearAllSelection(this.nodes);
1852
+ this.clearAllSelection(this.rootNodes.length ? this.rootNodes : this.nodes);
1852
1853
  node._selected = true;
1853
1854
  }
1854
1855
  else if (this.selection === 'multi') {
1855
1856
  const newState = !node._selected;
1856
1857
  this.setNodeAndChildren(node, newState);
1857
1858
  }
1858
- this.selectionChanged.emit(this.getSelected(this.nodes));
1859
+ const root = this.rootNodes.length ? this.rootNodes : this.nodes;
1860
+ this.selectionChanged.emit(this.getSelected(root));
1859
1861
  }
1860
1862
  clearAllSelection(nodes) {
1861
1863
  for (const n of nodes) {
@@ -1883,7 +1885,7 @@ class PkTreeviewNodeComponent {
1883
1885
  return result;
1884
1886
  }
1885
1887
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PkTreeviewNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1886
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PkTreeviewNodeComponent, isStandalone: true, selector: "pk-treeview-node", inputs: { nodes: "nodes", selection: "selection" }, outputs: { nodeToggled: "nodeToggled", selectionChanged: "selectionChanged" }, ngImport: i0, template: `
1888
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PkTreeviewNodeComponent, isStandalone: true, selector: "pk-treeview-node", inputs: { nodes: "nodes", rootNodes: "rootNodes", selection: "selection" }, outputs: { nodeToggled: "nodeToggled", selectionChanged: "selectionChanged" }, ngImport: i0, template: `
1887
1889
  <ul class="pk-tree-list">
1888
1890
  @for (node of nodes; track node) {
1889
1891
  <li class="pk-tree-item">
@@ -1947,6 +1949,7 @@ class PkTreeviewNodeComponent {
1947
1949
  <div class="pk-tree-children">
1948
1950
  <pk-treeview-node
1949
1951
  [nodes]="node.children!"
1952
+ [rootNodes]="rootNodes"
1950
1953
  [selection]="selection"
1951
1954
  (nodeToggled)="nodeToggled.emit($event)"
1952
1955
  (selectionChanged)="selectionChanged.emit($event)">
@@ -1956,11 +1959,11 @@ class PkTreeviewNodeComponent {
1956
1959
  </li>
1957
1960
  }
1958
1961
  </ul>
1959
- `, isInline: true, styles: [".pk-tree-list{list-style:none;margin:0;padding:0}.pk-tree-item{margin:0}.pk-tree-row{display:flex;align-items:center;gap:2px;padding:4px 6px;border-radius:4px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .15s}.pk-tree-row:hover{background:#f1f5f9}.pk-tree-row--selected{background:#e0f2fe}.pk-tree-toggle{display:inline-flex;align-items:center;width:18px;cursor:pointer;flex-shrink:0}.pk-tree-check{display:inline-flex;align-items:center;flex-shrink:0;margin-right:2px}.pk-tree-icon{display:inline-flex;align-items:center;flex-shrink:0}.pk-tree-label{font-size:14px;color:#1e293b;flex:1}.pk-tree-link{color:inherit;text-decoration:none}.pk-tree-link:hover{text-decoration:underline}.pk-tree-children{padding-left:20px}.pk-tree-cb{width:15px;height:15px;border-radius:3px;border:1.5px solid #94a3b8;background:#fff;display:inline-flex;align-items:center;justify-content:center;transition:border-color .15s,background .15s}.pk-tree-cb--checked{background:#0ea5e9;border-color:#0ea5e9}.pk-tree-cb--indeterminate{border-color:#0ea5e9}.pk-tree-cb-dash{width:8px;height:2px;background:#0ea5e9;border-radius:1px;display:block}.pk-tree-radio{width:14px;height:14px;border-radius:50%;border:1.5px solid #94a3b8;background:#fff;display:inline-flex;align-items:center;justify-content:center;transition:border-color .15s}.pk-tree-radio--checked{border-color:#0ea5e9;box-shadow:inset 0 0 0 3px #0ea5e9}\n"], dependencies: [{ kind: "component", type: PkTreeviewNodeComponent, selector: "pk-treeview-node", inputs: ["nodes", "selection"], outputs: ["nodeToggled", "selectionChanged"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: PkIcon, selector: "pk-icon", inputs: ["name", "iconSet", "size", "color", "fillColor", "viewBox", "strokeWidth", "variant", "fill", "weight", "grade", "opticalSize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1962
+ `, isInline: true, styles: [".pk-tree-list{list-style:none;margin:0;padding:0}.pk-tree-item{margin:0}.pk-tree-row{display:flex;align-items:center;gap:2px;padding:4px 6px;border-radius:4px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .15s}.pk-tree-row:hover{background:#f1f5f9}.pk-tree-row--selected{background:#e0f2fe}.pk-tree-toggle{display:inline-flex;align-items:center;width:18px;cursor:pointer;flex-shrink:0}.pk-tree-check{display:inline-flex;align-items:center;flex-shrink:0;margin-right:2px}.pk-tree-icon{display:inline-flex;align-items:center;flex-shrink:0}.pk-tree-label{font-size:14px;color:#1e293b;flex:1}.pk-tree-link{color:inherit;text-decoration:none}.pk-tree-link:hover{text-decoration:underline}.pk-tree-children{padding-left:20px}.pk-tree-cb{width:15px;height:15px;border-radius:3px;border:1.5px solid #94a3b8;background:#fff;display:inline-flex;align-items:center;justify-content:center;transition:border-color .15s,background .15s}.pk-tree-cb--checked{background:#0ea5e9;border-color:#0ea5e9}.pk-tree-cb--indeterminate{border-color:#0ea5e9}.pk-tree-cb-dash{width:8px;height:2px;background:#0ea5e9;border-radius:1px;display:block}.pk-tree-radio{width:14px;height:14px;border-radius:50%;border:1.5px solid #94a3b8;background:#fff;display:inline-flex;align-items:center;justify-content:center;transition:border-color .15s}.pk-tree-radio--checked{border-color:#0ea5e9;box-shadow:inset 0 0 0 3px #0ea5e9}\n"], dependencies: [{ kind: "component", type: PkTreeviewNodeComponent, selector: "pk-treeview-node", inputs: ["nodes", "rootNodes", "selection"], outputs: ["nodeToggled", "selectionChanged"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: PkIcon, selector: "pk-icon", inputs: ["name", "iconSet", "size", "color", "fillColor", "viewBox", "strokeWidth", "variant", "fill", "weight", "grade", "opticalSize"] }] });
1960
1963
  }
1961
1964
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PkTreeviewNodeComponent, decorators: [{
1962
1965
  type: Component,
1963
- args: [{ selector: 'pk-treeview-node', imports: [RouterModule, PkIcon], changeDetection: ChangeDetectionStrategy.OnPush, template: `
1966
+ args: [{ selector: 'pk-treeview-node', imports: [RouterModule, PkIcon], template: `
1964
1967
  <ul class="pk-tree-list">
1965
1968
  @for (node of nodes; track node) {
1966
1969
  <li class="pk-tree-item">
@@ -2024,6 +2027,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2024
2027
  <div class="pk-tree-children">
2025
2028
  <pk-treeview-node
2026
2029
  [nodes]="node.children!"
2030
+ [rootNodes]="rootNodes"
2027
2031
  [selection]="selection"
2028
2032
  (nodeToggled)="nodeToggled.emit($event)"
2029
2033
  (selectionChanged)="selectionChanged.emit($event)">
@@ -2036,6 +2040,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2036
2040
  `, styles: [".pk-tree-list{list-style:none;margin:0;padding:0}.pk-tree-item{margin:0}.pk-tree-row{display:flex;align-items:center;gap:2px;padding:4px 6px;border-radius:4px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .15s}.pk-tree-row:hover{background:#f1f5f9}.pk-tree-row--selected{background:#e0f2fe}.pk-tree-toggle{display:inline-flex;align-items:center;width:18px;cursor:pointer;flex-shrink:0}.pk-tree-check{display:inline-flex;align-items:center;flex-shrink:0;margin-right:2px}.pk-tree-icon{display:inline-flex;align-items:center;flex-shrink:0}.pk-tree-label{font-size:14px;color:#1e293b;flex:1}.pk-tree-link{color:inherit;text-decoration:none}.pk-tree-link:hover{text-decoration:underline}.pk-tree-children{padding-left:20px}.pk-tree-cb{width:15px;height:15px;border-radius:3px;border:1.5px solid #94a3b8;background:#fff;display:inline-flex;align-items:center;justify-content:center;transition:border-color .15s,background .15s}.pk-tree-cb--checked{background:#0ea5e9;border-color:#0ea5e9}.pk-tree-cb--indeterminate{border-color:#0ea5e9}.pk-tree-cb-dash{width:8px;height:2px;background:#0ea5e9;border-radius:1px;display:block}.pk-tree-radio{width:14px;height:14px;border-radius:50%;border:1.5px solid #94a3b8;background:#fff;display:inline-flex;align-items:center;justify-content:center;transition:border-color .15s}.pk-tree-radio--checked{border-color:#0ea5e9;box-shadow:inset 0 0 0 3px #0ea5e9}\n"] }]
2037
2041
  }], propDecorators: { nodes: [{
2038
2042
  type: Input
2043
+ }], rootNodes: [{
2044
+ type: Input
2039
2045
  }], selection: [{
2040
2046
  type: Input
2041
2047
  }], nodeToggled: [{
@@ -2214,12 +2220,13 @@ class PkTreeviewComponent {
2214
2220
 
2215
2221
  <pk-treeview-node
2216
2222
  [nodes]="nodes"
2223
+ [rootNodes]="nodes"
2217
2224
  [selection]="selection"
2218
2225
  (nodeToggled)="onNodeToggled($event)"
2219
2226
  (selectionChanged)="onSelectionChanged($event)">
2220
2227
  </pk-treeview-node>
2221
2228
  </div>
2222
- `, isInline: true, styles: [".pk-treeview{font-family:inherit;font-size:14px}.pk-tree-select-all{display:flex;align-items:center;gap:6px;padding:4px 8px 6px;border-bottom:1px solid #e2e8f0;margin-bottom:4px;cursor:pointer}.pk-tree-select-all-label{font-size:13px;color:#475569;font-weight:500;-webkit-user-select:none;user-select:none}.pk-tree-cb{width:15px;height:15px;border-radius:3px;border:1.5px solid #94a3b8;background:#fff;display:inline-flex;align-items:center;justify-content:center;transition:border-color .15s,background .15s;flex-shrink:0}.pk-tree-cb--checked{background:#0ea5e9;border-color:#0ea5e9}.pk-tree-cb--indeterminate{border-color:#0ea5e9}.pk-tree-cb-dash{width:8px;height:2px;background:#0ea5e9;border-radius:1px;display:block}\n"], dependencies: [{ kind: "component", type: PkIcon, selector: "pk-icon", inputs: ["name", "iconSet", "size", "color", "fillColor", "viewBox", "strokeWidth", "variant", "fill", "weight", "grade", "opticalSize"] }, { kind: "component", type: PkTreeviewNodeComponent, selector: "pk-treeview-node", inputs: ["nodes", "selection"], outputs: ["nodeToggled", "selectionChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2229
+ `, isInline: true, styles: [".pk-treeview{font-family:inherit;font-size:14px}.pk-tree-select-all{display:flex;align-items:center;gap:6px;padding:4px 8px 6px;border-bottom:1px solid #e2e8f0;margin-bottom:4px;cursor:pointer}.pk-tree-select-all-label{font-size:13px;color:#475569;font-weight:500;-webkit-user-select:none;user-select:none}.pk-tree-cb{width:15px;height:15px;border-radius:3px;border:1.5px solid #94a3b8;background:#fff;display:inline-flex;align-items:center;justify-content:center;transition:border-color .15s,background .15s;flex-shrink:0}.pk-tree-cb--checked{background:#0ea5e9;border-color:#0ea5e9}.pk-tree-cb--indeterminate{border-color:#0ea5e9}.pk-tree-cb-dash{width:8px;height:2px;background:#0ea5e9;border-radius:1px;display:block}\n"], dependencies: [{ kind: "component", type: PkIcon, selector: "pk-icon", inputs: ["name", "iconSet", "size", "color", "fillColor", "viewBox", "strokeWidth", "variant", "fill", "weight", "grade", "opticalSize"] }, { kind: "component", type: PkTreeviewNodeComponent, selector: "pk-treeview-node", inputs: ["nodes", "rootNodes", "selection"], outputs: ["nodeToggled", "selectionChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2223
2230
  }
2224
2231
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PkTreeviewComponent, decorators: [{
2225
2232
  type: Component,
@@ -2246,6 +2253,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2246
2253
 
2247
2254
  <pk-treeview-node
2248
2255
  [nodes]="nodes"
2256
+ [rootNodes]="nodes"
2249
2257
  [selection]="selection"
2250
2258
  (nodeToggled)="onNodeToggled($event)"
2251
2259
  (selectionChanged)="onSelectionChanged($event)">
@@ -2289,6 +2297,8 @@ class PkSelectComponent {
2289
2297
  labelField = input('label', ...(ngDevMode ? [{ debugName: "labelField" }] : /* istanbul ignore next */ []));
2290
2298
  valueField = input('value', ...(ngDevMode ? [{ debugName: "valueField" }] : /* istanbul ignore next */ []));
2291
2299
  returnObjects = input(false, ...(ngDevMode ? [{ debugName: "returnObjects" }] : /* istanbul ignore next */ []));
2300
+ customClass = input(null, ...(ngDevMode ? [{ debugName: "customClass" }] : /* istanbul ignore next */ []));
2301
+ customStyle = input(null, ...(ngDevMode ? [{ debugName: "customStyle" }] : /* istanbul ignore next */ []));
2292
2302
  change = output();
2293
2303
  isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
2294
2304
  searchQuery = signal('', ...(ngDevMode ? [{ debugName: "searchQuery" }] : /* istanbul ignore next */ []));
@@ -2432,18 +2442,19 @@ class PkSelectComponent {
2432
2442
  return value;
2433
2443
  }
2434
2444
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PkSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2435
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PkSelectComponent, isStandalone: true, selector: "pk-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, labelField: { classPropertyName: "labelField", publicName: "labelField", isSignal: true, isRequired: false, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, returnObjects: { classPropertyName: "returnObjects", publicName: "returnObjects", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { change: "change" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, providers: [
2445
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PkSelectComponent, isStandalone: true, selector: "pk-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, labelField: { classPropertyName: "labelField", publicName: "labelField", isSignal: true, isRequired: false, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, returnObjects: { classPropertyName: "returnObjects", publicName: "returnObjects", isSignal: true, isRequired: false, transformFunction: null }, customClass: { classPropertyName: "customClass", publicName: "customClass", isSignal: true, isRequired: false, transformFunction: null }, customStyle: { classPropertyName: "customStyle", publicName: "customStyle", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { change: "change" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, providers: [
2436
2446
  {
2437
2447
  provide: NG_VALUE_ACCESSOR,
2438
2448
  useExisting: forwardRef(() => PkSelectComponent),
2439
2449
  multi: true
2440
2450
  }
2441
2451
  ], ngImport: i0, template: `
2442
- <div class="pk-select-container">
2452
+ <div class="pk-select-container" [class]="customClass()">
2443
2453
  <div
2444
2454
  class="pk-select-trigger"
2445
2455
  [class.pk-select-trigger-open]="isOpen()"
2446
2456
  [class.pk-select-trigger-disabled]="disabled()"
2457
+ [ngStyle]="customStyle()"
2447
2458
  (click)="toggleDropdown()">
2448
2459
  <span class="pk-select-value">
2449
2460
  @if (displayValue()) {
@@ -2498,11 +2509,11 @@ class PkSelectComponent {
2498
2509
  </div>
2499
2510
  }
2500
2511
  </div>
2501
- `, isInline: true, styles: [".pk-select-container{position:relative;width:100%}.pk-select-trigger{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border:1px solid #d1d5db;border-radius:6px;background-color:#fff;cursor:pointer;transition:all .2s;min-height:38px}.pk-select-trigger:hover:not(.pk-select-trigger-disabled){border-color:#3b82f6}.pk-select-trigger-open{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.pk-select-trigger-disabled{background-color:#f3f4f6;cursor:not-allowed;opacity:.6}.pk-select-value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pk-select-placeholder{color:#9ca3af}.pk-select-arrow{margin-left:8px;font-size:12px;color:#6b7280;transition:transform .2s}.pk-select-arrow-open{transform:rotate(180deg)}.pk-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;background-color:#fff;border:1px solid #d1d5db;border-radius:6px;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;z-index:1000;max-height:300px;overflow:hidden;display:flex;flex-direction:column}.pk-select-search{padding:8px;border-bottom:1px solid #e5e7eb}.pk-select-search-input{width:100%;padding:6px 10px;border:1px solid #d1d5db;border-radius:4px;font-size:14px;outline:none}.pk-select-search-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.pk-select-options{overflow-y:auto;max-height:250px}.pk-select-option{display:flex;align-items:center;padding:8px 12px;cursor:pointer;transition:background-color .2s}.pk-select-option:hover:not(.pk-select-option-disabled){background-color:#f3f4f6}.pk-select-option-selected{background-color:#dbeafe;color:#1e40af}.pk-select-option-disabled{opacity:.5;cursor:not-allowed}.pk-select-checkbox{margin-right:8px;cursor:pointer}.pk-select-option-label{flex:1}.pk-select-no-options{padding:16px 12px;text-align:center;color:#9ca3af;font-size:14px}\n"] });
2512
+ `, isInline: true, styles: [".pk-select-container{position:relative;width:100%}.pk-select-trigger{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border:1px solid #d1d5db;border-radius:6px;background-color:#fff;cursor:pointer;transition:all .2s}.pk-select-trigger:hover:not(.pk-select-trigger-disabled){border-color:#3b82f6}.pk-select-trigger-open{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.pk-select-trigger-disabled{background-color:#f3f4f6;cursor:not-allowed;opacity:.6}.pk-select-value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pk-select-placeholder{color:#9ca3af}.pk-select-arrow{margin-left:8px;font-size:12px;color:#6b7280;transition:transform .2s}.pk-select-arrow-open{transform:rotate(180deg)}.pk-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;background-color:#fff;border:1px solid #d1d5db;border-radius:6px;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;z-index:1000;max-height:300px;overflow:hidden;display:flex;flex-direction:column}.pk-select-search{padding:8px;border-bottom:1px solid #e5e7eb}.pk-select-search-input{width:100%;padding:6px 10px;border:1px solid #d1d5db;border-radius:4px;font-size:14px;outline:none}.pk-select-search-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.pk-select-options{overflow-y:auto;max-height:250px}.pk-select-option{display:flex;align-items:center;padding:8px 12px;cursor:pointer;transition:background-color .2s}.pk-select-option:hover:not(.pk-select-option-disabled){background-color:#f3f4f6}.pk-select-option-selected{background-color:#dbeafe;color:#1e40af}.pk-select-option-disabled{opacity:.5;cursor:not-allowed}.pk-select-checkbox{margin-right:8px;cursor:pointer}.pk-select-option-label{flex:1}.pk-select-no-options{padding:16px 12px;text-align:center;color:#9ca3af;font-size:14px}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
2502
2513
  }
2503
2514
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PkSelectComponent, decorators: [{
2504
2515
  type: Component,
2505
- args: [{ selector: 'pk-select', standalone: true, imports: [], providers: [
2516
+ args: [{ selector: 'pk-select', standalone: true, imports: [NgStyle], providers: [
2506
2517
  {
2507
2518
  provide: NG_VALUE_ACCESSOR,
2508
2519
  useExisting: forwardRef(() => PkSelectComponent),
@@ -2511,11 +2522,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2511
2522
  ], host: {
2512
2523
  '(document:click)': 'onDocumentClick($event)'
2513
2524
  }, template: `
2514
- <div class="pk-select-container">
2525
+ <div class="pk-select-container" [class]="customClass()">
2515
2526
  <div
2516
2527
  class="pk-select-trigger"
2517
2528
  [class.pk-select-trigger-open]="isOpen()"
2518
2529
  [class.pk-select-trigger-disabled]="disabled()"
2530
+ [ngStyle]="customStyle()"
2519
2531
  (click)="toggleDropdown()">
2520
2532
  <span class="pk-select-value">
2521
2533
  @if (displayValue()) {
@@ -2570,8 +2582,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2570
2582
  </div>
2571
2583
  }
2572
2584
  </div>
2573
- `, styles: [".pk-select-container{position:relative;width:100%}.pk-select-trigger{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border:1px solid #d1d5db;border-radius:6px;background-color:#fff;cursor:pointer;transition:all .2s;min-height:38px}.pk-select-trigger:hover:not(.pk-select-trigger-disabled){border-color:#3b82f6}.pk-select-trigger-open{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.pk-select-trigger-disabled{background-color:#f3f4f6;cursor:not-allowed;opacity:.6}.pk-select-value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pk-select-placeholder{color:#9ca3af}.pk-select-arrow{margin-left:8px;font-size:12px;color:#6b7280;transition:transform .2s}.pk-select-arrow-open{transform:rotate(180deg)}.pk-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;background-color:#fff;border:1px solid #d1d5db;border-radius:6px;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;z-index:1000;max-height:300px;overflow:hidden;display:flex;flex-direction:column}.pk-select-search{padding:8px;border-bottom:1px solid #e5e7eb}.pk-select-search-input{width:100%;padding:6px 10px;border:1px solid #d1d5db;border-radius:4px;font-size:14px;outline:none}.pk-select-search-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.pk-select-options{overflow-y:auto;max-height:250px}.pk-select-option{display:flex;align-items:center;padding:8px 12px;cursor:pointer;transition:background-color .2s}.pk-select-option:hover:not(.pk-select-option-disabled){background-color:#f3f4f6}.pk-select-option-selected{background-color:#dbeafe;color:#1e40af}.pk-select-option-disabled{opacity:.5;cursor:not-allowed}.pk-select-checkbox{margin-right:8px;cursor:pointer}.pk-select-option-label{flex:1}.pk-select-no-options{padding:16px 12px;text-align:center;color:#9ca3af;font-size:14px}\n"] }]
2574
- }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], labelField: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelField", required: false }] }], valueField: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueField", required: false }] }], returnObjects: [{ type: i0.Input, args: [{ isSignal: true, alias: "returnObjects", required: false }] }], change: [{ type: i0.Output, args: ["change"] }] } });
2585
+ `, styles: [".pk-select-container{position:relative;width:100%}.pk-select-trigger{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border:1px solid #d1d5db;border-radius:6px;background-color:#fff;cursor:pointer;transition:all .2s}.pk-select-trigger:hover:not(.pk-select-trigger-disabled){border-color:#3b82f6}.pk-select-trigger-open{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.pk-select-trigger-disabled{background-color:#f3f4f6;cursor:not-allowed;opacity:.6}.pk-select-value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pk-select-placeholder{color:#9ca3af}.pk-select-arrow{margin-left:8px;font-size:12px;color:#6b7280;transition:transform .2s}.pk-select-arrow-open{transform:rotate(180deg)}.pk-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;background-color:#fff;border:1px solid #d1d5db;border-radius:6px;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;z-index:1000;max-height:300px;overflow:hidden;display:flex;flex-direction:column}.pk-select-search{padding:8px;border-bottom:1px solid #e5e7eb}.pk-select-search-input{width:100%;padding:6px 10px;border:1px solid #d1d5db;border-radius:4px;font-size:14px;outline:none}.pk-select-search-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.pk-select-options{overflow-y:auto;max-height:250px}.pk-select-option{display:flex;align-items:center;padding:8px 12px;cursor:pointer;transition:background-color .2s}.pk-select-option:hover:not(.pk-select-option-disabled){background-color:#f3f4f6}.pk-select-option-selected{background-color:#dbeafe;color:#1e40af}.pk-select-option-disabled{opacity:.5;cursor:not-allowed}.pk-select-checkbox{margin-right:8px;cursor:pointer}.pk-select-option-label{flex:1}.pk-select-no-options{padding:16px 12px;text-align:center;color:#9ca3af;font-size:14px}\n"] }]
2586
+ }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], labelField: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelField", required: false }] }], valueField: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueField", required: false }] }], returnObjects: [{ type: i0.Input, args: [{ isSignal: true, alias: "returnObjects", required: false }] }], customClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "customClass", required: false }] }], customStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "customStyle", required: false }] }], change: [{ type: i0.Output, args: ["change"] }] } });
2575
2587
 
2576
2588
  class PkAutocompleteComponent {
2577
2589
  elementRef = inject(ElementRef);
@@ -2583,6 +2595,8 @@ class PkAutocompleteComponent {
2583
2595
  debounceTime = input(300, ...(ngDevMode ? [{ debugName: "debounceTime" }] : /* istanbul ignore next */ []));
2584
2596
  disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
2585
2597
  displayKey = input('label', ...(ngDevMode ? [{ debugName: "displayKey" }] : /* istanbul ignore next */ []));
2598
+ customClass = input('', ...(ngDevMode ? [{ debugName: "customClass" }] : /* istanbul ignore next */ []));
2599
+ customStyle = input(null, ...(ngDevMode ? [{ debugName: "customStyle" }] : /* istanbul ignore next */ []));
2586
2600
  // State
2587
2601
  searchTerm = signal('', ...(ngDevMode ? [{ debugName: "searchTerm" }] : /* istanbul ignore next */ []));
2588
2602
  isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
@@ -2758,16 +2772,16 @@ class PkAutocompleteComponent {
2758
2772
  // Handled by input() signal
2759
2773
  }
2760
2774
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PkAutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2761
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PkAutocompleteComponent, isStandalone: true, selector: "pk-autocomplete", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, fetchFn: { classPropertyName: "fetchFn", publicName: "fetchFn", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, minChars: { classPropertyName: "minChars", publicName: "minChars", isSignal: true, isRequired: false, transformFunction: null }, debounceTime: { classPropertyName: "debounceTime", publicName: "debounceTime", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, displayKey: { classPropertyName: "displayKey", publicName: "displayKey", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "document:click": "onClickOutside($event)" } }, providers: [
2775
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PkAutocompleteComponent, isStandalone: true, selector: "pk-autocomplete", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, fetchFn: { classPropertyName: "fetchFn", publicName: "fetchFn", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, minChars: { classPropertyName: "minChars", publicName: "minChars", isSignal: true, isRequired: false, transformFunction: null }, debounceTime: { classPropertyName: "debounceTime", publicName: "debounceTime", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, displayKey: { classPropertyName: "displayKey", publicName: "displayKey", isSignal: true, isRequired: false, transformFunction: null }, customClass: { classPropertyName: "customClass", publicName: "customClass", isSignal: true, isRequired: false, transformFunction: null }, customStyle: { classPropertyName: "customStyle", publicName: "customStyle", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "document:click": "onClickOutside($event)" } }, providers: [
2762
2776
  {
2763
2777
  provide: NG_VALUE_ACCESSOR,
2764
2778
  useExisting: forwardRef(() => PkAutocompleteComponent),
2765
2779
  multi: true,
2766
2780
  },
2767
2781
  ], ngImport: i0, template: `
2768
- <div class="relative w-full">
2782
+ <div class="pk-autocomplete" [ngClass]="customClass()" [ngStyle]="customStyle()">
2769
2783
  <!-- Input -->
2770
- <div class="relative">
2784
+ <div class="pk-autocomplete__input-wrap">
2771
2785
  <input
2772
2786
  #inputElement
2773
2787
  type="text"
@@ -2777,21 +2791,22 @@ class PkAutocompleteComponent {
2777
2791
  (keydown)="onKeyDown($event)"
2778
2792
  [placeholder]="placeholder()"
2779
2793
  [disabled]="disabled()"
2780
- class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100 disabled:cursor-not-allowed"
2781
- [class.pr-10]="loading() || (searchTerm() && !loading())"
2794
+ [ngStyle]="customStyle()"
2795
+ class="pk-autocomplete__input"
2796
+ [class.pk-autocomplete__input--with-action]="loading() || (searchTerm() && !loading())"
2782
2797
  />
2783
2798
 
2784
2799
  <!-- Loading Spinner or Clear Button -->
2785
2800
  @if (loading()) {
2786
- <div class="absolute right-3 top-1/2 -translate-y-1/2">
2801
+ <div class="pk-autocomplete__action">
2787
2802
  <div class="pk-spinner pk-spinner-sm"></div>
2788
2803
  </div>
2789
2804
  } @else if (searchTerm() && !disabled()) {
2790
2805
  <button
2791
2806
  type="button"
2792
2807
  (click)="clear()"
2793
- class="absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600">
2794
- <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
2808
+ class="pk-autocomplete__clear-btn">
2809
+ <svg class="pk-autocomplete__clear-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
2795
2810
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
2796
2811
  </svg>
2797
2812
  </button>
@@ -2800,20 +2815,20 @@ class PkAutocompleteComponent {
2800
2815
 
2801
2816
  <!-- Dropdown -->
2802
2817
  @if (isOpen() && !disabled()) {
2803
- <div class="absolute z-50 w-full mt-1 bg-white border border-gray-300 rounded-lg shadow-lg max-h-60 overflow-auto">
2818
+ <div class="pk-autocomplete__dropdown">
2804
2819
  @if (loading()) {
2805
- <div class="px-4 py-8 text-center text-gray-500">
2806
- <div class="pk-spinner pk-spinner-sm mx-auto mb-2"></div>
2807
- <p class="text-sm">กำลังค้นหา...</p>
2820
+ <div class="pk-autocomplete__state">
2821
+ <div class="pk-spinner pk-spinner-sm"></div>
2822
+ <p>กำลังค้นหา...</p>
2808
2823
  </div>
2809
2824
  } @else if (filteredOptions().length === 0) {
2810
- <div class="px-4 py-8 text-center text-gray-500">
2811
- <svg class="w-12 h-12 mx-auto mb-2 text-gray-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
2825
+ <div class="pk-autocomplete__state">
2826
+ <svg class="pk-autocomplete__empty-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
2812
2827
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
2813
2828
  </svg>
2814
- <p class="text-sm">ไม่พบข้อมูล</p>
2829
+ <p>ไม่พบข้อมูล</p>
2815
2830
  @if (searchTerm()) {
2816
- <p class="text-xs mt-1">ลองค้นหาด้วยคำอื่น</p>
2831
+ <p class="pk-autocomplete__subtext">ลองค้นหาด้วยคำอื่น</p>
2817
2832
  }
2818
2833
  </div>
2819
2834
  } @else {
@@ -2822,12 +2837,12 @@ class PkAutocompleteComponent {
2822
2837
  type="button"
2823
2838
  (click)="selectOption(option)"
2824
2839
  [disabled]="option.disabled"
2825
- class="w-full px-4 py-2 text-left hover:bg-blue-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
2826
- [class.bg-blue-100]="highlightedIndex() === idx"
2827
- [class.font-medium]="isSelected(option)">
2840
+ class="pk-autocomplete__option"
2841
+ [class.pk-autocomplete__option--active]="highlightedIndex() === idx"
2842
+ [class.pk-autocomplete__option--selected]="isSelected(option)">
2828
2843
  {{ option.label }}
2829
2844
  @if (isSelected(option)) {
2830
- <span class="float-right text-blue-600">✓</span>
2845
+ <span class="pk-autocomplete__check">✓</span>
2831
2846
  }
2832
2847
  </button>
2833
2848
  }
@@ -2835,25 +2850,20 @@ class PkAutocompleteComponent {
2835
2850
  </div>
2836
2851
  }
2837
2852
  </div>
2838
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2853
+ `, isInline: true, styles: [".pk-autocomplete{position:relative;width:100%}.pk-autocomplete__input-wrap{position:relative}.pk-autocomplete__input{width:100%;height:40px;padding:0 14px;border:1px solid #d5d9e0;border-radius:10px;background:#fff;color:#1f2937;font-size:14px;line-height:1;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.pk-autocomplete__input::placeholder{color:#9aa3af}.pk-autocomplete__input:focus{outline:none;border-color:#2563eb;box-shadow:0 0 0 3px #2563eb24}.pk-autocomplete__input:disabled{background:#f4f6f8;color:#9aa3af;cursor:not-allowed}.pk-autocomplete__input--with-action{padding-right:40px}.pk-autocomplete__action,.pk-autocomplete__clear-btn{position:absolute;right:10px;top:50%;transform:translateY(-50%);display:inline-flex;align-items:center;justify-content:center}.pk-autocomplete__clear-btn{width:24px;height:24px;border:none;border-radius:999px;background:transparent;color:#98a2b3;cursor:pointer;transition:background-color .15s ease,color .15s ease}.pk-autocomplete__clear-btn:hover{background:#eef2f7;color:#4b5563}.pk-autocomplete__clear-icon{width:16px;height:16px}.pk-autocomplete__dropdown{position:absolute;z-index:50;width:100%;margin-top:6px;background:#fff;border:1px solid #dbe1e8;border-radius:12px;box-shadow:0 14px 30px #0f172a24;max-height:260px;overflow:auto}.pk-autocomplete__state{min-height:110px;padding:14px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:#6b7280;font-size:13px}.pk-autocomplete__empty-icon{width:34px;height:34px;color:#c2cad4}.pk-autocomplete__subtext{margin:0;color:#9aa3af;font-size:12px}.pk-autocomplete__option{width:100%;padding:10px 14px;border:none;background:transparent;color:#1f2937;font-size:14px;text-align:left;display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:background-color .12s ease}.pk-autocomplete__option:hover{background:#f1f5ff}.pk-autocomplete__option--active{background:#e7efff}.pk-autocomplete__option--selected{font-weight:600}.pk-autocomplete__option:disabled{opacity:.45;cursor:not-allowed}.pk-autocomplete__check{color:#2563eb}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2839
2854
  }
2840
2855
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PkAutocompleteComponent, decorators: [{
2841
2856
  type: Component,
2842
- args: [{
2843
- selector: 'pk-autocomplete',
2844
- standalone: true,
2845
- imports: [FormsModule],
2846
- providers: [
2857
+ args: [{ selector: 'pk-autocomplete', standalone: true, imports: [FormsModule, NgClass, NgStyle], providers: [
2847
2858
  {
2848
2859
  provide: NG_VALUE_ACCESSOR,
2849
2860
  useExisting: forwardRef(() => PkAutocompleteComponent),
2850
2861
  multi: true,
2851
2862
  },
2852
- ],
2853
- template: `
2854
- <div class="relative w-full">
2863
+ ], template: `
2864
+ <div class="pk-autocomplete" [ngClass]="customClass()" [ngStyle]="customStyle()">
2855
2865
  <!-- Input -->
2856
- <div class="relative">
2866
+ <div class="pk-autocomplete__input-wrap">
2857
2867
  <input
2858
2868
  #inputElement
2859
2869
  type="text"
@@ -2863,21 +2873,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2863
2873
  (keydown)="onKeyDown($event)"
2864
2874
  [placeholder]="placeholder()"
2865
2875
  [disabled]="disabled()"
2866
- class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100 disabled:cursor-not-allowed"
2867
- [class.pr-10]="loading() || (searchTerm() && !loading())"
2876
+ [ngStyle]="customStyle()"
2877
+ class="pk-autocomplete__input"
2878
+ [class.pk-autocomplete__input--with-action]="loading() || (searchTerm() && !loading())"
2868
2879
  />
2869
2880
 
2870
2881
  <!-- Loading Spinner or Clear Button -->
2871
2882
  @if (loading()) {
2872
- <div class="absolute right-3 top-1/2 -translate-y-1/2">
2883
+ <div class="pk-autocomplete__action">
2873
2884
  <div class="pk-spinner pk-spinner-sm"></div>
2874
2885
  </div>
2875
2886
  } @else if (searchTerm() && !disabled()) {
2876
2887
  <button
2877
2888
  type="button"
2878
2889
  (click)="clear()"
2879
- class="absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600">
2880
- <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
2890
+ class="pk-autocomplete__clear-btn">
2891
+ <svg class="pk-autocomplete__clear-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
2881
2892
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
2882
2893
  </svg>
2883
2894
  </button>
@@ -2886,20 +2897,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2886
2897
 
2887
2898
  <!-- Dropdown -->
2888
2899
  @if (isOpen() && !disabled()) {
2889
- <div class="absolute z-50 w-full mt-1 bg-white border border-gray-300 rounded-lg shadow-lg max-h-60 overflow-auto">
2900
+ <div class="pk-autocomplete__dropdown">
2890
2901
  @if (loading()) {
2891
- <div class="px-4 py-8 text-center text-gray-500">
2892
- <div class="pk-spinner pk-spinner-sm mx-auto mb-2"></div>
2893
- <p class="text-sm">กำลังค้นหา...</p>
2902
+ <div class="pk-autocomplete__state">
2903
+ <div class="pk-spinner pk-spinner-sm"></div>
2904
+ <p>กำลังค้นหา...</p>
2894
2905
  </div>
2895
2906
  } @else if (filteredOptions().length === 0) {
2896
- <div class="px-4 py-8 text-center text-gray-500">
2897
- <svg class="w-12 h-12 mx-auto mb-2 text-gray-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
2907
+ <div class="pk-autocomplete__state">
2908
+ <svg class="pk-autocomplete__empty-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
2898
2909
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
2899
2910
  </svg>
2900
- <p class="text-sm">ไม่พบข้อมูล</p>
2911
+ <p>ไม่พบข้อมูล</p>
2901
2912
  @if (searchTerm()) {
2902
- <p class="text-xs mt-1">ลองค้นหาด้วยคำอื่น</p>
2913
+ <p class="pk-autocomplete__subtext">ลองค้นหาด้วยคำอื่น</p>
2903
2914
  }
2904
2915
  </div>
2905
2916
  } @else {
@@ -2908,12 +2919,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2908
2919
  type="button"
2909
2920
  (click)="selectOption(option)"
2910
2921
  [disabled]="option.disabled"
2911
- class="w-full px-4 py-2 text-left hover:bg-blue-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
2912
- [class.bg-blue-100]="highlightedIndex() === idx"
2913
- [class.font-medium]="isSelected(option)">
2922
+ class="pk-autocomplete__option"
2923
+ [class.pk-autocomplete__option--active]="highlightedIndex() === idx"
2924
+ [class.pk-autocomplete__option--selected]="isSelected(option)">
2914
2925
  {{ option.label }}
2915
2926
  @if (isSelected(option)) {
2916
- <span class="float-right text-blue-600">✓</span>
2927
+ <span class="pk-autocomplete__check">✓</span>
2917
2928
  }
2918
2929
  </button>
2919
2930
  }
@@ -2921,10 +2932,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2921
2932
  </div>
2922
2933
  }
2923
2934
  </div>
2924
- `,
2925
- changeDetection: ChangeDetectionStrategy.OnPush,
2926
- }]
2927
- }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], fetchFn: [{ type: i0.Input, args: [{ isSignal: true, alias: "fetchFn", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], minChars: [{ type: i0.Input, args: [{ isSignal: true, alias: "minChars", required: false }] }], debounceTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "debounceTime", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], displayKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayKey", required: false }] }], onClickOutside: [{
2935
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".pk-autocomplete{position:relative;width:100%}.pk-autocomplete__input-wrap{position:relative}.pk-autocomplete__input{width:100%;height:40px;padding:0 14px;border:1px solid #d5d9e0;border-radius:10px;background:#fff;color:#1f2937;font-size:14px;line-height:1;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.pk-autocomplete__input::placeholder{color:#9aa3af}.pk-autocomplete__input:focus{outline:none;border-color:#2563eb;box-shadow:0 0 0 3px #2563eb24}.pk-autocomplete__input:disabled{background:#f4f6f8;color:#9aa3af;cursor:not-allowed}.pk-autocomplete__input--with-action{padding-right:40px}.pk-autocomplete__action,.pk-autocomplete__clear-btn{position:absolute;right:10px;top:50%;transform:translateY(-50%);display:inline-flex;align-items:center;justify-content:center}.pk-autocomplete__clear-btn{width:24px;height:24px;border:none;border-radius:999px;background:transparent;color:#98a2b3;cursor:pointer;transition:background-color .15s ease,color .15s ease}.pk-autocomplete__clear-btn:hover{background:#eef2f7;color:#4b5563}.pk-autocomplete__clear-icon{width:16px;height:16px}.pk-autocomplete__dropdown{position:absolute;z-index:50;width:100%;margin-top:6px;background:#fff;border:1px solid #dbe1e8;border-radius:12px;box-shadow:0 14px 30px #0f172a24;max-height:260px;overflow:auto}.pk-autocomplete__state{min-height:110px;padding:14px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:#6b7280;font-size:13px}.pk-autocomplete__empty-icon{width:34px;height:34px;color:#c2cad4}.pk-autocomplete__subtext{margin:0;color:#9aa3af;font-size:12px}.pk-autocomplete__option{width:100%;padding:10px 14px;border:none;background:transparent;color:#1f2937;font-size:14px;text-align:left;display:flex;align-items:center;justify-content:space-between;cursor:pointer;transition:background-color .12s ease}.pk-autocomplete__option:hover{background:#f1f5ff}.pk-autocomplete__option--active{background:#e7efff}.pk-autocomplete__option--selected{font-weight:600}.pk-autocomplete__option:disabled{opacity:.45;cursor:not-allowed}.pk-autocomplete__check{color:#2563eb}\n"] }]
2936
+ }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], fetchFn: [{ type: i0.Input, args: [{ isSignal: true, alias: "fetchFn", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], minChars: [{ type: i0.Input, args: [{ isSignal: true, alias: "minChars", required: false }] }], debounceTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "debounceTime", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], displayKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayKey", required: false }] }], customClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "customClass", required: false }] }], customStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "customStyle", required: false }] }], onClickOutside: [{
2928
2937
  type: HostListener,
2929
2938
  args: ['document:click', ['$event']]
2930
2939
  }] } });