@kubex/zinc 1.1.71 → 1.1.73

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.
@@ -47,6 +47,79 @@
47
47
  }
48
48
  ]
49
49
  },
50
+ {
51
+ "kind": "javascript-module",
52
+ "path": "components/action-bar/action-bar.js",
53
+ "declarations": [
54
+ {
55
+ "kind": "class",
56
+ "description": "",
57
+ "name": "ZnActionBar",
58
+ "cssProperties": [
59
+ {
60
+ "description": "An example CSS custom property.",
61
+ "name": "--example"
62
+ }
63
+ ],
64
+ "cssParts": [
65
+ {
66
+ "description": "The component's base wrapper.",
67
+ "name": "base"
68
+ }
69
+ ],
70
+ "slots": [
71
+ {
72
+ "description": "The default slot.",
73
+ "name": ""
74
+ },
75
+ {
76
+ "description": "An example slot.",
77
+ "name": "example"
78
+ }
79
+ ],
80
+ "members": [
81
+ {
82
+ "kind": "field",
83
+ "name": "localize",
84
+ "privacy": "private",
85
+ "readonly": true,
86
+ "default": "new LocalizeController(this)"
87
+ }
88
+ ],
89
+ "events": [
90
+ {
91
+ "description": "Emitted as an example.",
92
+ "name": "zn-event-name"
93
+ }
94
+ ],
95
+ "superclass": {
96
+ "name": "ZincElement",
97
+ "module": "/src/internal/zinc-element"
98
+ },
99
+ "summary": "Short summary of the component's intended use.",
100
+ "tagNameWithoutPrefix": "action-bar",
101
+ "tagName": "zn-action-bar",
102
+ "customElement": true,
103
+ "jsDoc": "/**\n * @summary Short summary of the component's intended use.\n * @documentation https://zinc.style/components/action-bar\n * @status experimental\n * @since 1.0\n *\n * @dependency zn-example\n *\n * @event zn-event-name - Emitted as an example.\n *\n * @slot - The default slot.\n * @slot example - An example slot.\n *\n * @csspart base - The component's base wrapper.\n *\n * @cssproperty --example - An example CSS custom property.\n */",
104
+ "documentation": "https://zinc.style/components/action-bar",
105
+ "status": "experimental",
106
+ "since": "1.0",
107
+ "dependencies": [
108
+ "zn-example"
109
+ ]
110
+ }
111
+ ],
112
+ "exports": [
113
+ {
114
+ "kind": "js",
115
+ "name": "default",
116
+ "declaration": {
117
+ "name": "ZnActionBar",
118
+ "module": "components/action-bar/action-bar.js"
119
+ }
120
+ }
121
+ ]
122
+ },
50
123
  {
51
124
  "kind": "javascript-module",
52
125
  "path": "components/alert/alert.js",
@@ -241,79 +314,6 @@
241
314
  }
242
315
  ]
243
316
  },
244
- {
245
- "kind": "javascript-module",
246
- "path": "components/action-bar/action-bar.js",
247
- "declarations": [
248
- {
249
- "kind": "class",
250
- "description": "",
251
- "name": "ZnActionBar",
252
- "cssProperties": [
253
- {
254
- "description": "An example CSS custom property.",
255
- "name": "--example"
256
- }
257
- ],
258
- "cssParts": [
259
- {
260
- "description": "The component's base wrapper.",
261
- "name": "base"
262
- }
263
- ],
264
- "slots": [
265
- {
266
- "description": "The default slot.",
267
- "name": ""
268
- },
269
- {
270
- "description": "An example slot.",
271
- "name": "example"
272
- }
273
- ],
274
- "members": [
275
- {
276
- "kind": "field",
277
- "name": "localize",
278
- "privacy": "private",
279
- "readonly": true,
280
- "default": "new LocalizeController(this)"
281
- }
282
- ],
283
- "events": [
284
- {
285
- "description": "Emitted as an example.",
286
- "name": "zn-event-name"
287
- }
288
- ],
289
- "superclass": {
290
- "name": "ZincElement",
291
- "module": "/src/internal/zinc-element"
292
- },
293
- "summary": "Short summary of the component's intended use.",
294
- "tagNameWithoutPrefix": "action-bar",
295
- "tagName": "zn-action-bar",
296
- "customElement": true,
297
- "jsDoc": "/**\n * @summary Short summary of the component's intended use.\n * @documentation https://zinc.style/components/action-bar\n * @status experimental\n * @since 1.0\n *\n * @dependency zn-example\n *\n * @event zn-event-name - Emitted as an example.\n *\n * @slot - The default slot.\n * @slot example - An example slot.\n *\n * @csspart base - The component's base wrapper.\n *\n * @cssproperty --example - An example CSS custom property.\n */",
298
- "documentation": "https://zinc.style/components/action-bar",
299
- "status": "experimental",
300
- "since": "1.0",
301
- "dependencies": [
302
- "zn-example"
303
- ]
304
- }
305
- ],
306
- "exports": [
307
- {
308
- "kind": "js",
309
- "name": "default",
310
- "declaration": {
311
- "name": "ZnActionBar",
312
- "module": "components/action-bar/action-bar.js"
313
- }
314
- }
315
- ]
316
- },
317
317
  {
318
318
  "kind": "javascript-module",
319
319
  "path": "components/animated-button/animated-button.js",
@@ -17204,6 +17204,19 @@
17204
17204
  "kind": "method",
17205
17205
  "name": "_handleTriggerClick",
17206
17206
  "privacy": "private"
17207
+ },
17208
+ {
17209
+ "kind": "method",
17210
+ "name": "_handleTriggerKeyDown",
17211
+ "privacy": "private",
17212
+ "parameters": [
17213
+ {
17214
+ "name": "e",
17215
+ "type": {
17216
+ "text": "KeyboardEvent"
17217
+ }
17218
+ }
17219
+ ]
17207
17220
  }
17208
17221
  ],
17209
17222
  "attributes": [
@@ -43877,7 +43890,7 @@
43877
43890
  "package": {
43878
43891
  "name": "@kubex/zinc",
43879
43892
  "description": "A collection of web components for building web applications based off of @shoelace-style/Shoelace",
43880
- "version": "1.1.71",
43893
+ "version": "1.1.73",
43881
43894
  "author": "",
43882
43895
  "license": "MIT"
43883
43896
  }
@@ -13,6 +13,17 @@
13
13
  }
14
14
  ]
15
15
  },
16
+ {
17
+ "name": "zn-action-bar",
18
+ "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
19
+ "attributes": [],
20
+ "references": [
21
+ {
22
+ "name": "Documentation",
23
+ "url": "https://zinc.style/components/action-bar"
24
+ }
25
+ ]
26
+ },
16
27
  {
17
28
  "name": "zn-alert",
18
29
  "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
@@ -53,17 +64,6 @@
53
64
  }
54
65
  ]
55
66
  },
56
- {
57
- "name": "zn-action-bar",
58
- "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
59
- "attributes": [],
60
- "references": [
61
- {
62
- "name": "Documentation",
63
- "url": "https://zinc.style/components/action-bar"
64
- }
65
- ]
66
- },
67
67
  {
68
68
  "name": "zn-animated-button",
69
69
  "description": "\n---\n\n\n### **Methods:**\n - **purchase(): _void_** - Programmatically trigger the purchase flow\n- **setSuccess(): _void_** - Set the button to success state manually\n- **setFailure(message): _void_** - Set the button to failure state manually with optional error message\n- **reset(): _void_** - Reset the button to idle state",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "name": "@kubex/zinc",
4
- "version": "1.1.71",
4
+ "version": "1.1.73",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -15,6 +15,28 @@
15
15
  "events": [],
16
16
  "js": { "properties": [], "events": [] }
17
17
  },
18
+ {
19
+ "name": "zn-action-bar",
20
+ "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
21
+ "doc-url": "",
22
+ "attributes": [],
23
+ "slots": [
24
+ { "name": "", "description": "The default slot." },
25
+ { "name": "example", "description": "An example slot." }
26
+ ],
27
+ "events": [
28
+ { "name": "zn-event-name", "description": "Emitted as an example." }
29
+ ],
30
+ "js": {
31
+ "properties": [],
32
+ "events": [
33
+ {
34
+ "name": "zn-event-name",
35
+ "description": "Emitted as an example."
36
+ }
37
+ ]
38
+ }
39
+ },
18
40
  {
19
41
  "name": "zn-alert",
20
42
  "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
@@ -83,28 +105,6 @@
83
105
  ]
84
106
  }
85
107
  },
86
- {
87
- "name": "zn-action-bar",
88
- "description": "Short summary of the component's intended use.\n---\n\n\n### **Events:**\n - **zn-event-name** - Emitted as an example.\n\n### **Slots:**\n - _default_ - The default slot.\n- **example** - An example slot.\n\n### **CSS Properties:**\n - **--example** - An example CSS custom property. _(default: undefined)_\n\n### **CSS Parts:**\n - **base** - The component's base wrapper.",
89
- "doc-url": "",
90
- "attributes": [],
91
- "slots": [
92
- { "name": "", "description": "The default slot." },
93
- { "name": "example", "description": "An example slot." }
94
- ],
95
- "events": [
96
- { "name": "zn-event-name", "description": "Emitted as an example." }
97
- ],
98
- "js": {
99
- "properties": [],
100
- "events": [
101
- {
102
- "name": "zn-event-name",
103
- "description": "Emitted as an example."
104
- }
105
- ]
106
- }
107
- },
108
108
  {
109
109
  "name": "zn-animated-button",
110
110
  "description": "\n---\n\n\n### **Methods:**\n - **purchase(): _void_** - Programmatically trigger the purchase flow\n- **setSuccess(): _void_** - Set the button to success state manually\n- **setFailure(message): _void_** - Set the button to failure state manually with optional error message\n- **reset(): _void_** - Reset the button to idle state",
package/dist/zn.d.ts CHANGED
@@ -4759,6 +4759,7 @@ declare module "components/icon-picker/icon-picker.component" {
4759
4759
  private handleFreeInput;
4760
4760
  private handleClear;
4761
4761
  private _handleTriggerClick;
4762
+ private _handleTriggerKeyDown;
4762
4763
  render(): import("lit-html").TemplateResult<1>;
4763
4764
  }
4764
4765
  }
package/dist/zn.min.js CHANGED
@@ -1658,7 +1658,7 @@ import{a as En,b as c_,c as pr,d as c,e as B}from"./chunks/zn.UBLZO6CI.js";var Z
1658
1658
  </div>
1659
1659
  </div>
1660
1660
  </div>
1661
- `}};Ce.styles=[jo.styles,E(wv)],Ce.dependencies={"zn-button":Ct,"zn-copy-button":$h,"zn-expanding-action":Xh,"zn-icon":ct,"zn-navbar":aa,"zn-tab":Qh},c([p()],Ce.prototype,"caption",2),c([p({attribute:"entity-id"})],Ce.prototype,"entityId",2),c([p({attribute:"entity-id-show",type:Boolean})],Ce.prototype,"entityIdShow",2),c([p({attribute:"full-location"})],Ce.prototype,"fullLocation",2),c([p({type:Boolean,reflect:!0})],Ce.prototype,"modal",2),c([p({type:Boolean,reflect:!0})],Ce.prototype,"nested",2),c([p({type:Boolean,reflect:!0})],Ce.prototype,"primary",2),c([p({attribute:"previous-path"})],Ce.prototype,"previousPath",2),c([p({attribute:"previous-target"})],Ce.prototype,"previousTarget",2),c([p()],Ce.prototype,"summary",2),c([O()],Ce.prototype,"scrolled",2),c([O()],Ce.prototype,"tabDefinitions",2),c([O()],Ce.prototype,"hasExpandingActions",2);var z3=Ce;Ce.define("zn-page");var _v=S`@keyframes rotate-gradient{from{--rotate:0deg}to{--rotate:360deg}}:host{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-transform:none}:host *,:host *::before,:host *::after{box-sizing:border-box;border-width:0;border-style:solid;border-color:rgb(var(--zn-border-color))}[hidden]{display:none !important}.width-container,.form-container,.wide-form-container{height:100%;width:100%;margin:var(--zn-default-margin,0 auto)}.width-container{max-width:var(--zn-container)}.form-container{max-width:var(--zn-container-ph)}.wide-form-container{max-width:var(--zn-container-lg)}.form-control-input{margin:var(--zn-spacing-2x-small) 3px 3px 0}.form-control-input--flush{margin:0}.form-control .form-control__label{display:none}.form-control .form-control__help-text{display:none}.form-control--has-label .form-control__label{display:inline-block;color:var(--zn-input-label-color);font-weight:var(--zn-input-label-font-weight);line-height:var(--zn-input-label-line-height);margin-bottom:var(--zn-spacing-x-small)}.form-control--has-label.form-control--medium .form-control__label{font-size:var(--zn-input-label-font-size-medium)}.form-control--has-label.form-control--large .form-control__label{font-size:var(--zn-input-label-font-size-large)}:host([required]) .form-control--has-label .form-control__label::after{content:var(--zn-input-required-content);margin-inline-start:var(--zn-input-required-content-offset);color:var(--zn-input-required-content-color)}.form-control--has-label.form-control--radio-group .form-control__label,.form-control--has-label.form-control--checkbox-group .form-control__label{margin-bottom:0}.form-control--has-label.form-control--has-label-tooltip .form-control__label{display:inline-flex;align-items:center;gap:var(--zn-spacing-2x-small)}.form-control--has-label.form-control--small .form-control__label{font-size:var(--zn-input-label-font-size-small)}.form-control--label-tooltip{color:var(--zn-color-neutral-700);font-size:var(--zn-font-size-small)}.form-control--label-tooltip zn-icon{--icon-color:var(--zn-color-neutral-700);--icon-size:var(--zn-font-size-small)}.form-control--has-label.form-control--has-context-note{display:flex;justify-content:space-between;flex-wrap:wrap}.form-control__label-context-note{color:var(--zn-input-help-text-color);font-size:var(--zn-font-size-small);margin-bottom:var(--zn-spacing-2x-small)}.form-control--has-label.form-control--has-context-note .form-control-input{width:100%}.form-control--has-help-text .form-control__help-text,.radio--has-description .radio__description,.checkbox--has-description .checkbox__description{display:block;color:var(--zn-input-help-text-color);margin-top:var(--zn-spacing-x-small)}.radio--has-description .radio__description,.checkbox--has-description .checkbox__description{margin-top:0.375rem}.radio--has-selected-content .radio__selected-content,.checkbox--has-selected-content .checkbox__selected-content{display:block;margin-top:var(--zn-spacing-small)}.form-control--has-help-text.form-control--small .form-control__help-text{font-size:var(--zn-input-help-text-font-size-small)}.form-control--has-help-text.form-control--medium .form-control__help-text,.radio--has-description .radio__description,.checkbox--has-description .checkbox__description{font-size:var(--zn-input-help-text-font-size-medium)}.form-control--has-help-text.form-control--large .form-control__help-text{font-size:var(--zn-input-help-text-font-size-large)}.form-control--has-help-text.form-control--radio-group .form-control__help-text,.form-control--has-help-text.form-control--checkbox-group .form-control__help-text{margin-top:var(--zn-spacing-medium)}.form-control--has-help-text .switch .form-control__help-text{margin-top:var(--zn-spacing-3x-small)}.form-control--checkbox-contained-wrapper{height:100%}:host{display:block}.form-control-input{display:flex;align-items:center;gap:var(--zn-spacing-x-small)}zn-dialog{--width:min(80vw,900px);--icon-color:rgb(var(--zn-text))}.icon-picker__dialog-layout{display:flex;gap:var(--zn-spacing-large);height:40vh}.icon-picker__dialog-main{flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden}.icon-picker__dialog-sidebar{width:180px;flex-shrink:0}@media (max-width:640px){zn-dialog{--width:100vw}zn-dialog::part(base){max-width:100%;max-height:100%;margin:0;border-radius:0;height:100dvh;width:100vw}.icon-picker__dialog-layout{height:calc(100dvh - 8rem);flex-direction:column}.icon-picker__dialog-sidebar{width:100%;flex-shrink:0}}.icon-picker__mode-switch{display:flex;gap:var(--zn-spacing-x-small);margin-bottom:var(--zn-spacing-small)}.icon-picker__upload{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--zn-spacing-small);border:dashed 1px rgb(var(--zn-border-color));border-radius:var(--zn-border-radius);padding:var(--zn-spacing-large);color:rgb(var(--zn-text-muted))}.icon-picker__upload-preview{max-width:100%;max-height:160px;-o-object-fit:contain;object-fit:contain;border-radius:var(--zn-border-radius)}.icon-picker__upload-filename{font-size:var(--zn-font-size-small);color:rgb(var(--zn-text-muted));word-break:break-all}.icon-picker__dialog-controls{display:flex;gap:var(--zn-spacing-small);margin-bottom:var(--zn-spacing-small)}.icon-picker__library-select{flex:1;min-width:0}.icon-picker__color-input{width:140px;flex-shrink:0}.icon-picker__icon-input{margin-bottom:var(--zn-spacing-small)}.icon-picker__search{margin-bottom:var(--zn-spacing-small)}.icon-picker__free-input{margin-bottom:var(--zn-spacing-small)}.icon-picker__grid{display:flex;flex-wrap:wrap;gap:var(--zn-spacing-x-small);flex:1;overflow-y:auto;align-content:flex-start;border:solid 1px rgb(var(--zn-border-color));border-radius:var(--zn-border-radius);padding:var(--zn-spacing-x-small)}.icon-picker__grid-item{display:flex;align-items:center;justify-content:center;width:48px;height:48px;padding:0;border:2px solid transparent;border-radius:var(--zn-border-radius);background:transparent;color:var(--zn-text-color);cursor:pointer;transition:var(--zn-transition-fast) background-color,var(--zn-transition-fast) border-color}.icon-picker__grid-item:hover{background-color:rgba(var(--zn-color-primary),0.1)}.icon-picker__grid-item--selected{border-color:rgb(var(--zn-color-primary));background-color:rgba(var(--zn-color-primary),0.1)}.icon-picker__no-results{width:100%;text-align:center;padding:var(--zn-spacing-large);color:rgb(var(--zn-text-muted))}.icon-picker__preview{display:flex;flex-direction:column;align-items:center;gap:var(--zn-spacing-small);padding:var(--zn-spacing-medium);background-color:rgba(var(--zn-panel-secondary),0.5);border-radius:var(--zn-border-radius);text-align:center}.icon-picker__preview--empty{color:rgb(var(--zn-text-muted))}.icon-picker__preview-name{font-size:var(--zn-font-size-medium);font-family:var(--zn-font-mono);word-break:break-all}.icon-picker__preview-library{font-size:var(--zn-font-size-small);color:rgb(var(--zn-text-muted))}.icon-picker__preview-hint{font-size:var(--zn-font-size-small);color:rgb(var(--zn-text-muted))}`;var zt=class zt extends C{constructor(){super(...arguments);this.formControlController=new ot(this,{assumeInteractionOn:["zn-change"],value:t=>t._file??t.icon});this.name="";this.icon="";this.label="";this.library="material-symbols-outlined";this.color="";this.noColor=!1;this.noLibrary=!1;this.helpText="";this.disabled=!1;this.required=!1;this.triggerSubmit=!1;this.allowUpload=!1;this.accept="image/*";this.defaultValue="";this._dialogOpen=!1;this._searchQuery="";this._iconList=[];this._filteredIcons=[];this._pendingIcon="";this._pendingLibrary="";this._pendingColor="";this._pendingFile=null;this._pendingFileUrl=null;this._mode="icon";this._file=null;this._fileUrl=null}get value(){return this.icon}set value(t){this.icon=t}get file(){return this._file}get isImageValue(){return!!this._file||this.icon.includes("/")}get validity(){return this.required&&!this.icon&&!this._file?{valid:!1,valueMissing:!0,badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1}:{valid:!0,valueMissing:!1,badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1}}get validationMessage(){return this.required&&!this.icon&&!this._file?"Please select an icon.":""}checkValidity(){return this.validity.valid}getForm(){return this.formControlController.getForm()}reportValidity(){return this.checkValidity()}setCustomValidity(t){this.formControlController.updateValidity()}isFreeInputLibrary(t){return zt.freeInputLibraries.has(t)}async getIconsForLibrary(t){try{switch(t){case"brands":return(await import("./chunks/zn.CU5HCKLN.js")).brandIcons;case"line":return(await import("./chunks/zn.7VCR5ZZL.js")).lineIcons;default:{let r=await import("./chunks/zn.NKUIXDNI.js");switch(t){case"material-outlined":return r.material_outlinedIcons;case"material-round":return r.material_roundIcons;case"material-sharp":return r.material_sharpIcons;case"material-two-tone":return r.material_two_toneIcons;case"material-symbols-outlined":return r.material_symbols_outlinedIcons;default:return r.materialIcons}}}}catch{return[]}}async openDialog(){this._pendingIcon=this.isImageValue?"":this.icon,this._pendingLibrary=this.library,this._pendingColor=this.color,this._searchQuery="",this._mode=this.allowUpload&&this.isImageValue?"upload":"icon",this._iconList=await this.getIconsForLibrary(this.library),this._filteredIcons=this._iconList.slice(0,200),this._dialogOpen=!0,await this.updateComplete,this._dialog.show()}closeDialog(){this.discardPendingFile(),this._dialog.hide(),this._dialogOpen=!1}handleConfirm(){this._mode==="upload"?this._pendingFile&&(this._fileUrl&&URL.revokeObjectURL(this._fileUrl),this._file=this._pendingFile,this._fileUrl=this._pendingFileUrl,this._pendingFile=null,this._pendingFileUrl=null,this.icon=""):(this.icon=this._pendingIcon,this.library=this._pendingLibrary,this.color=this._pendingColor,this.clearFile()),this.closeDialog(),this.emit("zn-change"),this.triggerSubmit&&this.formControlController.submit()}handleCancel(){this.closeDialog()}handleFileSelect(t){let r=t.target,n=r.files?.[0]??null;n&&(this.discardPendingFile(),this._pendingFile=n,this._pendingFileUrl=URL.createObjectURL(n),r.value="")}discardPendingFile(){this._pendingFileUrl&&URL.revokeObjectURL(this._pendingFileUrl),this._pendingFile=null,this._pendingFileUrl=null}clearFile(){this._fileUrl&&URL.revokeObjectURL(this._fileUrl),this._file=null,this._fileUrl=null}disconnectedCallback(){super.disconnectedCallback(),this.discardPendingFile(),this._fileUrl&&URL.revokeObjectURL(this._fileUrl)}handleSearchInput(t){let r=t.target;this._searchQuery=r.value.toLowerCase(),this.filterIcons()}filterIcons(){this._searchQuery?this._filteredIcons=this._iconList.filter(t=>t.includes(this._searchQuery)).slice(0,200):this._filteredIcons=this._iconList.slice(0,200)}handleIconSelect(t){this._pendingIcon=t}async handleLibraryChange(t){let r=t.target,n=this.isFreeInputLibrary(this._pendingLibrary);this._pendingLibrary=r.value;let a=this.isFreeInputLibrary(this._pendingLibrary);n!==a&&(this._pendingIcon=""),a||(this._iconList=await this.getIconsForLibrary(this._pendingLibrary),this.filterIcons())}handleColorInput(t){let r=t.target;this._pendingColor=r.value}handleFreeInput(t){let r=t.target;this._pendingIcon=r.value}handleClear(t){t.stopPropagation(),this.icon="",this.color="",this.clearFile(),this.emit("zn-change"),this.triggerSubmit&&this.formControlController.submit()}_handleTriggerClick(){this.disabled||this.openDialog()}render(){let t=!!this.label,r=!!this.helpText,n=!!this.icon||!!this._file,a=this._fileUrl??this.icon,s=n&&!this.isImageValue?this.library:V,l=this._pendingFileUrl??(this.isImageValue&&!this._file?this.icon:this._fileUrl);return u`
1661
+ `}};Ce.styles=[jo.styles,E(wv)],Ce.dependencies={"zn-button":Ct,"zn-copy-button":$h,"zn-expanding-action":Xh,"zn-icon":ct,"zn-navbar":aa,"zn-tab":Qh},c([p()],Ce.prototype,"caption",2),c([p({attribute:"entity-id"})],Ce.prototype,"entityId",2),c([p({attribute:"entity-id-show",type:Boolean})],Ce.prototype,"entityIdShow",2),c([p({attribute:"full-location"})],Ce.prototype,"fullLocation",2),c([p({type:Boolean,reflect:!0})],Ce.prototype,"modal",2),c([p({type:Boolean,reflect:!0})],Ce.prototype,"nested",2),c([p({type:Boolean,reflect:!0})],Ce.prototype,"primary",2),c([p({attribute:"previous-path"})],Ce.prototype,"previousPath",2),c([p({attribute:"previous-target"})],Ce.prototype,"previousTarget",2),c([p()],Ce.prototype,"summary",2),c([O()],Ce.prototype,"scrolled",2),c([O()],Ce.prototype,"tabDefinitions",2),c([O()],Ce.prototype,"hasExpandingActions",2);var z3=Ce;Ce.define("zn-page");var _v=S`@keyframes rotate-gradient{from{--rotate:0deg}to{--rotate:360deg}}:host{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-transform:none}:host *,:host *::before,:host *::after{box-sizing:border-box;border-width:0;border-style:solid;border-color:rgb(var(--zn-border-color))}[hidden]{display:none !important}.width-container,.form-container,.wide-form-container{height:100%;width:100%;margin:var(--zn-default-margin,0 auto)}.width-container{max-width:var(--zn-container)}.form-container{max-width:var(--zn-container-ph)}.wide-form-container{max-width:var(--zn-container-lg)}.form-control-input{margin:var(--zn-spacing-2x-small) 3px 3px 0}.form-control-input--flush{margin:0}.form-control .form-control__label{display:none}.form-control .form-control__help-text{display:none}.form-control--has-label .form-control__label{display:inline-block;color:var(--zn-input-label-color);font-weight:var(--zn-input-label-font-weight);line-height:var(--zn-input-label-line-height);margin-bottom:var(--zn-spacing-x-small)}.form-control--has-label.form-control--medium .form-control__label{font-size:var(--zn-input-label-font-size-medium)}.form-control--has-label.form-control--large .form-control__label{font-size:var(--zn-input-label-font-size-large)}:host([required]) .form-control--has-label .form-control__label::after{content:var(--zn-input-required-content);margin-inline-start:var(--zn-input-required-content-offset);color:var(--zn-input-required-content-color)}.form-control--has-label.form-control--radio-group .form-control__label,.form-control--has-label.form-control--checkbox-group .form-control__label{margin-bottom:0}.form-control--has-label.form-control--has-label-tooltip .form-control__label{display:inline-flex;align-items:center;gap:var(--zn-spacing-2x-small)}.form-control--has-label.form-control--small .form-control__label{font-size:var(--zn-input-label-font-size-small)}.form-control--label-tooltip{color:var(--zn-color-neutral-700);font-size:var(--zn-font-size-small)}.form-control--label-tooltip zn-icon{--icon-color:var(--zn-color-neutral-700);--icon-size:var(--zn-font-size-small)}.form-control--has-label.form-control--has-context-note{display:flex;justify-content:space-between;flex-wrap:wrap}.form-control__label-context-note{color:var(--zn-input-help-text-color);font-size:var(--zn-font-size-small);margin-bottom:var(--zn-spacing-2x-small)}.form-control--has-label.form-control--has-context-note .form-control-input{width:100%}.form-control--has-help-text .form-control__help-text,.radio--has-description .radio__description,.checkbox--has-description .checkbox__description{display:block;color:var(--zn-input-help-text-color);margin-top:var(--zn-spacing-x-small)}.radio--has-description .radio__description,.checkbox--has-description .checkbox__description{margin-top:0.375rem}.radio--has-selected-content .radio__selected-content,.checkbox--has-selected-content .checkbox__selected-content{display:block;margin-top:var(--zn-spacing-small)}.form-control--has-help-text.form-control--small .form-control__help-text{font-size:var(--zn-input-help-text-font-size-small)}.form-control--has-help-text.form-control--medium .form-control__help-text,.radio--has-description .radio__description,.checkbox--has-description .checkbox__description{font-size:var(--zn-input-help-text-font-size-medium)}.form-control--has-help-text.form-control--large .form-control__help-text{font-size:var(--zn-input-help-text-font-size-large)}.form-control--has-help-text.form-control--radio-group .form-control__help-text,.form-control--has-help-text.form-control--checkbox-group .form-control__help-text{margin-top:var(--zn-spacing-medium)}.form-control--has-help-text .switch .form-control__help-text{margin-top:var(--zn-spacing-3x-small)}.form-control--checkbox-contained-wrapper{height:100%}:host{display:block}.form-control-input{display:flex;align-items:center;gap:var(--zn-spacing-x-small)}zn-dialog{--width:min(80vw,900px);--icon-color:rgb(var(--zn-text))}.icon-picker__image-trigger{position:relative;flex:1;min-width:0;min-height:180px;border:1px solid var(--zn-input-border-color);border-radius:var(--zn-border-radius);cursor:pointer;transition:var(--zn-transition-medium) background,var(--zn-transition-medium) border-color}.icon-picker__image-trigger:focus-visible{border-color:var(--zn-color-primary-600);outline:var(--zn-focus-ring);outline-offset:var(--zn-focus-ring-offset)}.icon-picker__image-trigger:not(:focus-visible):hover{border-color:var(--zn-color-primary-700)}:host([disabled]) .icon-picker__image-trigger{cursor:not-allowed;opacity:0.5}.icon-picker__image-trigger-background{--zn-droparea-checker-size:12px;--zn-droparea-checker-a:var(--zn-color-neutral-50);--zn-droparea-checker-b:var(--zn-color-neutral-100);display:flex;align-items:center;justify-content:center;width:100%;height:100%;min-height:inherit;padding:var(--zn-spacing-large) var(--zn-spacing-medium);box-sizing:border-box;background-color:var(--zn-droparea-checker-a);background-image:linear-gradient(45deg,var(--zn-droparea-checker-b) 25%,transparent 25%),linear-gradient(-45deg,var(--zn-droparea-checker-b) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--zn-droparea-checker-b) 75%),linear-gradient(-45deg,transparent 75%,var(--zn-droparea-checker-b) 75%);background-size:var(--zn-droparea-checker-size) var(--zn-droparea-checker-size);background-position:0 0,0 calc(var(--zn-droparea-checker-size) / 2),calc(var(--zn-droparea-checker-size) / 2) calc(var(--zn-droparea-checker-size) / -2),calc(var(--zn-droparea-checker-size) / -2) 0;border-radius:calc(var(--zn-border-radius) - 1px)}.icon-picker__image-trigger-preview{display:block;width:100%;height:150px;-o-object-fit:contain;object-fit:contain}.icon-picker__image-clear{position:absolute;top:var(--zn-spacing-small);right:var(--zn-spacing-small);z-index:1}.icon-picker__dialog-layout{display:flex;gap:var(--zn-spacing-large);height:40vh}.icon-picker__dialog-main{flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden}.icon-picker__dialog-sidebar{width:180px;flex-shrink:0}@media (max-width:640px){zn-dialog{--width:100vw}zn-dialog::part(base){max-width:100%;max-height:100%;margin:0;border-radius:0;height:100dvh;width:100vw}.icon-picker__dialog-layout{height:calc(100dvh - 8rem);flex-direction:column}.icon-picker__dialog-sidebar{width:100%;flex-shrink:0}}.icon-picker__mode-switch{display:flex;gap:var(--zn-spacing-x-small);margin-bottom:var(--zn-spacing-small)}.icon-picker__upload{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--zn-spacing-small);border:dashed 1px rgb(var(--zn-border-color));border-radius:var(--zn-border-radius);padding:var(--zn-spacing-large);color:rgb(var(--zn-text-muted))}.icon-picker__upload-preview{max-width:100%;max-height:160px;-o-object-fit:contain;object-fit:contain;border-radius:var(--zn-border-radius)}.icon-picker__upload-filename{font-size:var(--zn-font-size-small);color:rgb(var(--zn-text-muted));word-break:break-all}.icon-picker__dialog-controls{display:flex;gap:var(--zn-spacing-small);margin-bottom:var(--zn-spacing-small)}.icon-picker__library-select{flex:1;min-width:0}.icon-picker__color-input{width:140px;flex-shrink:0}.icon-picker__icon-input{margin-bottom:var(--zn-spacing-small)}.icon-picker__search{margin-bottom:var(--zn-spacing-small)}.icon-picker__free-input{margin-bottom:var(--zn-spacing-small)}.icon-picker__grid{display:flex;flex-wrap:wrap;gap:var(--zn-spacing-x-small);flex:1;overflow-y:auto;align-content:flex-start;border:solid 1px rgb(var(--zn-border-color));border-radius:var(--zn-border-radius);padding:var(--zn-spacing-x-small)}.icon-picker__grid-item{display:flex;align-items:center;justify-content:center;width:48px;height:48px;padding:0;border:2px solid transparent;border-radius:var(--zn-border-radius);background:transparent;color:var(--zn-text-color);cursor:pointer;transition:var(--zn-transition-fast) background-color,var(--zn-transition-fast) border-color}.icon-picker__grid-item:hover{background-color:rgba(var(--zn-color-primary),0.1)}.icon-picker__grid-item--selected{border-color:rgb(var(--zn-color-primary));background-color:rgba(var(--zn-color-primary),0.1)}.icon-picker__no-results{width:100%;text-align:center;padding:var(--zn-spacing-large);color:rgb(var(--zn-text-muted))}.icon-picker__preview{display:flex;flex-direction:column;align-items:center;gap:var(--zn-spacing-small);padding:var(--zn-spacing-medium);background-color:rgba(var(--zn-panel-secondary),0.5);border-radius:var(--zn-border-radius);text-align:center}.icon-picker__preview--empty{color:rgb(var(--zn-text-muted))}.icon-picker__preview-name{font-size:var(--zn-font-size-medium);font-family:var(--zn-font-mono);word-break:break-all}.icon-picker__preview-library{font-size:var(--zn-font-size-small);color:rgb(var(--zn-text-muted))}.icon-picker__preview-hint{font-size:var(--zn-font-size-small);color:rgb(var(--zn-text-muted))}.icon-picker__footer{display:flex;justify-content:flex-end;align-items:center;gap:var(--zn-spacing-small);--icon-color:currentColor}`;var zt=class zt extends C{constructor(){super(...arguments);this.formControlController=new ot(this,{assumeInteractionOn:["zn-change"],value:t=>t._file??t.icon});this.name="";this.icon="";this.label="";this.library="material-symbols-outlined";this.color="";this.noColor=!1;this.noLibrary=!1;this.helpText="";this.disabled=!1;this.required=!1;this.triggerSubmit=!1;this.allowUpload=!1;this.accept="image/*";this.defaultValue="";this._dialogOpen=!1;this._searchQuery="";this._iconList=[];this._filteredIcons=[];this._pendingIcon="";this._pendingLibrary="";this._pendingColor="";this._pendingFile=null;this._pendingFileUrl=null;this._mode="icon";this._file=null;this._fileUrl=null}get value(){return this.icon}set value(t){this.icon=t}get file(){return this._file}get isImageValue(){return!!this._file||this.icon.includes("/")}get validity(){return this.required&&!this.icon&&!this._file?{valid:!1,valueMissing:!0,badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1}:{valid:!0,valueMissing:!1,badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1}}get validationMessage(){return this.required&&!this.icon&&!this._file?"Please select an icon.":""}checkValidity(){return this.validity.valid}getForm(){return this.formControlController.getForm()}reportValidity(){return this.checkValidity()}setCustomValidity(t){this.formControlController.updateValidity()}isFreeInputLibrary(t){return zt.freeInputLibraries.has(t)}async getIconsForLibrary(t){try{switch(t){case"brands":return(await import("./chunks/zn.CU5HCKLN.js")).brandIcons;case"line":return(await import("./chunks/zn.7VCR5ZZL.js")).lineIcons;default:{let r=await import("./chunks/zn.NKUIXDNI.js");switch(t){case"material-outlined":return r.material_outlinedIcons;case"material-round":return r.material_roundIcons;case"material-sharp":return r.material_sharpIcons;case"material-two-tone":return r.material_two_toneIcons;case"material-symbols-outlined":return r.material_symbols_outlinedIcons;default:return r.materialIcons}}}}catch{return[]}}async openDialog(){this._pendingIcon=this.isImageValue?"":this.icon,this._pendingLibrary=this.library,this._pendingColor=this.color,this._searchQuery="",this._mode=this.allowUpload&&this.isImageValue?"upload":"icon",this._iconList=await this.getIconsForLibrary(this.library),this._filteredIcons=this._iconList.slice(0,200),this._dialogOpen=!0,await this.updateComplete,this._dialog.show()}closeDialog(){this.discardPendingFile(),this._dialog.hide(),this._dialogOpen=!1}handleConfirm(){this._mode==="upload"?this._pendingFile&&(this._fileUrl&&URL.revokeObjectURL(this._fileUrl),this._file=this._pendingFile,this._fileUrl=this._pendingFileUrl,this._pendingFile=null,this._pendingFileUrl=null,this.icon=""):(this.icon=this._pendingIcon,this.library=this._pendingLibrary,this.color=this._pendingColor,this.clearFile()),this.closeDialog(),this.emit("zn-change"),this.triggerSubmit&&this.formControlController.submit()}handleCancel(){this.closeDialog()}handleFileSelect(t){let r=t.target,n=r.files?.[0]??null;n&&(this.discardPendingFile(),this._pendingFile=n,this._pendingFileUrl=URL.createObjectURL(n),r.value="")}discardPendingFile(){this._pendingFileUrl&&URL.revokeObjectURL(this._pendingFileUrl),this._pendingFile=null,this._pendingFileUrl=null}clearFile(){this._fileUrl&&URL.revokeObjectURL(this._fileUrl),this._file=null,this._fileUrl=null}disconnectedCallback(){super.disconnectedCallback(),this.discardPendingFile(),this._fileUrl&&URL.revokeObjectURL(this._fileUrl)}handleSearchInput(t){let r=t.target;this._searchQuery=r.value.toLowerCase(),this.filterIcons()}filterIcons(){this._searchQuery?this._filteredIcons=this._iconList.filter(t=>t.includes(this._searchQuery)).slice(0,200):this._filteredIcons=this._iconList.slice(0,200)}handleIconSelect(t){this._pendingIcon=t}async handleLibraryChange(t){let r=t.target,n=this.isFreeInputLibrary(this._pendingLibrary);this._pendingLibrary=r.value;let a=this.isFreeInputLibrary(this._pendingLibrary);n!==a&&(this._pendingIcon=""),a||(this._iconList=await this.getIconsForLibrary(this._pendingLibrary),this.filterIcons())}handleColorInput(t){let r=t.target;this._pendingColor=r.value}handleFreeInput(t){let r=t.target;this._pendingIcon=r.value}handleClear(t){t.stopPropagation(),this.icon="",this.color="",this.clearFile(),this.emit("zn-change"),this.triggerSubmit&&this.formControlController.submit()}_handleTriggerClick(){this.disabled||this.openDialog()}_handleTriggerKeyDown(t){(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),this._handleTriggerClick())}render(){let t=!!this.label,r=!!this.helpText,n=!!this.icon||!!this._file,a=this._fileUrl??this.icon,s=n&&!this.isImageValue?this.library:V,l=this._pendingFileUrl??(this.isImageValue&&!this._file?this.icon:this._fileUrl);return u`
1662
1662
  <div part="form-control"
1663
1663
  class="form-control ${t?"form-control--has-label":""} ${r?"form-control--has-help-text":""}">
1664
1664
 
@@ -1668,27 +1668,51 @@ import{a as En,b as c_,c as pr,d as c,e as B}from"./chunks/zn.UBLZO6CI.js";var Z
1668
1668
  </label>
1669
1669
 
1670
1670
  <div part="form-control-input" class="form-control-input">
1671
- <zn-button
1672
- part="trigger"
1673
- class="icon-picker__trigger"
1674
- panel-bg
1675
- icon=${n?a:V}
1676
- icon-library=${s}
1677
- icon-color=${n&&!this.isImageValue&&this.color||V}
1678
- icon-size="24"
1679
- ?disabled=${this.disabled}
1680
- @click=${this._handleTriggerClick}>
1681
- ${n?"Click to edit":"Set an icon"}
1682
- </zn-button>
1683
- ${n?u`
1671
+ ${n&&this.isImageValue?u`
1672
+ <div
1673
+ part="trigger"
1674
+ class="icon-picker__image-trigger"
1675
+ role="button"
1676
+ aria-label="Click to edit"
1677
+ tabindex=${this.disabled?"-1":"0"}
1678
+ @click=${this._handleTriggerClick}
1679
+ @keydown=${this._handleTriggerKeyDown}>
1680
+ <zn-button
1681
+ class="icon-picker__image-clear"
1682
+ color="default"
1683
+ outline
1684
+ icon="close"
1685
+ icon-size="18"
1686
+ ?disabled=${this.disabled}
1687
+ @click="${this.handleClear}"
1688
+ ></zn-button>
1689
+ <div class="icon-picker__image-trigger-background">
1690
+ <img class="icon-picker__image-trigger-preview" src=${a} alt="">
1691
+ </div>
1692
+ </div>
1693
+ `:u`
1684
1694
  <zn-button
1685
- class="icon-picker__clear"
1686
- color="transparent"
1687
- icon="close"
1688
- icon-size="16"
1689
- @click="${this.handleClear}"
1690
- ></zn-button>
1691
- `:V}
1695
+ part="trigger"
1696
+ class="icon-picker__trigger"
1697
+ panel-bg
1698
+ icon=${n?a:V}
1699
+ icon-library=${s}
1700
+ icon-color=${n&&this.color||V}
1701
+ icon-size="24"
1702
+ ?disabled=${this.disabled}
1703
+ @click=${this._handleTriggerClick}>
1704
+ ${n?"Click to edit":"Set an icon"}
1705
+ </zn-button>
1706
+ ${n?u`
1707
+ <zn-button
1708
+ class="icon-picker__clear"
1709
+ color="transparent"
1710
+ icon="close"
1711
+ icon-size="16"
1712
+ @click="${this.handleClear}"
1713
+ ></zn-button>
1714
+ `:V}
1715
+ `}
1692
1716
  </div>
1693
1717
 
1694
1718
  ${this.name?u`
@@ -1853,11 +1877,11 @@ import{a as En,b as c_,c as pr,d as c,e as B}from"./chunks/zn.UBLZO6CI.js";var Z
1853
1877
  </div>
1854
1878
  </div>
1855
1879
 
1856
- <div slot="footer">
1857
- <zn-button color="default" @click=${this.handleCancel}>Cancel</zn-button>
1858
- <zn-button color="primary" @click=${this.handleConfirm}
1880
+ <div slot="footer" class="icon-picker__footer">
1881
+ <zn-button panel-bg icon="close" @click=${this.handleCancel}>Cancel</zn-button>
1882
+ <zn-button color="primary" icon="check" @click=${this.handleConfirm}
1859
1883
  ?disabled=${this._mode==="upload"?!this._pendingFile&&!this.isImageValue:!this._pendingIcon}>
1860
- Confirm
1884
+ Save
1861
1885
  </zn-button>
1862
1886
  </div>
1863
1887
  </zn-dialog>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubex/zinc",
3
- "version": "1.1.71",
3
+ "version": "1.1.73",
4
4
  "description": "A collection of web components for building web applications based off of @shoelace-style/Shoelace",
5
5
  "keywords": [
6
6
  "web components",
@@ -300,6 +300,13 @@ export default class ZnIconPicker extends ZincElement implements ZincFormControl
300
300
  this.openDialog();
301
301
  }
302
302
 
303
+ private _handleTriggerKeyDown(e: KeyboardEvent) {
304
+ if (e.key === 'Enter' || e.key === ' ') {
305
+ e.preventDefault();
306
+ this._handleTriggerClick();
307
+ }
308
+ }
309
+
303
310
  render() {
304
311
  const hasLabel = !!this.label;
305
312
  const hasHelpText = !!this.helpText;
@@ -320,27 +327,51 @@ export default class ZnIconPicker extends ZincElement implements ZincFormControl
320
327
  </label>
321
328
 
322
329
  <div part="form-control-input" class="form-control-input">
323
- <zn-button
324
- part="trigger"
325
- class="icon-picker__trigger"
326
- panel-bg
327
- icon=${hasValue ? triggerIcon : nothing}
328
- icon-library=${triggerLibrary}
329
- icon-color=${(hasValue && !this.isImageValue && this.color) || nothing}
330
- icon-size="24"
331
- ?disabled=${this.disabled}
332
- @click=${this._handleTriggerClick}>
333
- ${hasValue ? 'Click to edit' : 'Set an icon'}
334
- </zn-button>
335
- ${hasValue ? html`
330
+ ${hasValue && this.isImageValue ? html`
331
+ <div
332
+ part="trigger"
333
+ class="icon-picker__image-trigger"
334
+ role="button"
335
+ aria-label="Click to edit"
336
+ tabindex=${this.disabled ? '-1' : '0'}
337
+ @click=${this._handleTriggerClick}
338
+ @keydown=${this._handleTriggerKeyDown}>
339
+ <zn-button
340
+ class="icon-picker__image-clear"
341
+ color="default"
342
+ outline
343
+ icon="close"
344
+ icon-size="18"
345
+ ?disabled=${this.disabled}
346
+ @click="${this.handleClear}"
347
+ ></zn-button>
348
+ <div class="icon-picker__image-trigger-background">
349
+ <img class="icon-picker__image-trigger-preview" src=${triggerIcon} alt="">
350
+ </div>
351
+ </div>
352
+ ` : html`
336
353
  <zn-button
337
- class="icon-picker__clear"
338
- color="transparent"
339
- icon="close"
340
- icon-size="16"
341
- @click="${this.handleClear}"
342
- ></zn-button>
343
- ` : nothing}
354
+ part="trigger"
355
+ class="icon-picker__trigger"
356
+ panel-bg
357
+ icon=${hasValue ? triggerIcon : nothing}
358
+ icon-library=${triggerLibrary}
359
+ icon-color=${(hasValue && this.color) || nothing}
360
+ icon-size="24"
361
+ ?disabled=${this.disabled}
362
+ @click=${this._handleTriggerClick}>
363
+ ${hasValue ? 'Click to edit' : 'Set an icon'}
364
+ </zn-button>
365
+ ${hasValue ? html`
366
+ <zn-button
367
+ class="icon-picker__clear"
368
+ color="transparent"
369
+ icon="close"
370
+ icon-size="16"
371
+ @click="${this.handleClear}"
372
+ ></zn-button>
373
+ ` : nothing}
374
+ `}
344
375
  </div>
345
376
 
346
377
  ${this.name ? html`
@@ -508,11 +539,11 @@ export default class ZnIconPicker extends ZincElement implements ZincFormControl
508
539
  </div>
509
540
  </div>
510
541
 
511
- <div slot="footer">
512
- <zn-button color="default" @click=${this.handleCancel}>Cancel</zn-button>
513
- <zn-button color="primary" @click=${this.handleConfirm}
542
+ <div slot="footer" class="icon-picker__footer">
543
+ <zn-button panel-bg icon="close" @click=${this.handleCancel}>Cancel</zn-button>
544
+ <zn-button color="primary" icon="check" @click=${this.handleConfirm}
514
545
  ?disabled=${this._mode === 'upload' ? !this._pendingFile && !this.isImageValue : !this._pendingIcon}>
515
- Confirm
546
+ Save
516
547
  </zn-button>
517
548
  </div>
518
549
  </zn-dialog>
@@ -16,6 +16,77 @@ zn-dialog {
16
16
  --icon-color: rgb(var(--zn-text));
17
17
  }
18
18
 
19
+ // Mirrors zn-file's droparea preview so a chosen image reads the same as an
20
+ // uploaded file.
21
+ .icon-picker__image-trigger {
22
+ position: relative;
23
+ flex: 1;
24
+ min-width: 0;
25
+ min-height: 180px;
26
+ border: 1px solid var(--zn-input-border-color);
27
+ border-radius: var(--zn-border-radius);
28
+ cursor: pointer;
29
+ transition: var(--zn-transition-medium) background,
30
+ var(--zn-transition-medium) border-color;
31
+
32
+ &:focus-visible {
33
+ border-color: var(--zn-color-primary-600);
34
+ outline: var(--zn-focus-ring);
35
+ outline-offset: var(--zn-focus-ring-offset);
36
+ }
37
+
38
+ &:not(:focus-visible):hover {
39
+ border-color: var(--zn-color-primary-700);
40
+ }
41
+ }
42
+
43
+ :host([disabled]) .icon-picker__image-trigger {
44
+ cursor: not-allowed;
45
+ opacity: 0.5;
46
+ }
47
+
48
+ .icon-picker__image-trigger-background {
49
+ --zn-droparea-checker-size: 12px;
50
+ --zn-droparea-checker-a: var(--zn-color-neutral-50);
51
+ --zn-droparea-checker-b: var(--zn-color-neutral-100);
52
+
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ width: 100%;
57
+ height: 100%;
58
+ min-height: inherit;
59
+ padding: var(--zn-spacing-large) var(--zn-spacing-medium);
60
+ box-sizing: border-box;
61
+ background-color: var(--zn-droparea-checker-a);
62
+ background-image:
63
+ linear-gradient(45deg, var(--zn-droparea-checker-b) 25%, transparent 25%),
64
+ linear-gradient(-45deg, var(--zn-droparea-checker-b) 25%, transparent 25%),
65
+ linear-gradient(45deg, transparent 75%, var(--zn-droparea-checker-b) 75%),
66
+ linear-gradient(-45deg, transparent 75%, var(--zn-droparea-checker-b) 75%);
67
+ background-size: var(--zn-droparea-checker-size) var(--zn-droparea-checker-size);
68
+ background-position:
69
+ 0 0,
70
+ 0 calc(var(--zn-droparea-checker-size) / 2),
71
+ calc(var(--zn-droparea-checker-size) / 2) calc(var(--zn-droparea-checker-size) / -2),
72
+ calc(var(--zn-droparea-checker-size) / -2) 0;
73
+ border-radius: calc(var(--zn-border-radius) - 1px);
74
+ }
75
+
76
+ .icon-picker__image-trigger-preview {
77
+ display: block;
78
+ width: 100%;
79
+ height: 150px;
80
+ object-fit: contain;
81
+ }
82
+
83
+ .icon-picker__image-clear {
84
+ position: absolute;
85
+ top: var(--zn-spacing-small);
86
+ right: var(--zn-spacing-small);
87
+ z-index: 1;
88
+ }
89
+
19
90
  .icon-picker__dialog-layout {
20
91
  display: flex;
21
92
  gap: var(--zn-spacing-large);
@@ -195,3 +266,14 @@ zn-dialog {
195
266
  color: rgb(var(--zn-text-muted));
196
267
  }
197
268
 
269
+ // Mirrors the global .form-actions layout, which isn't available in the
270
+ // shadow DOM. currentColor undoes the dialog-wide --icon-color override so
271
+ // button icons match their button's text colour.
272
+ .icon-picker__footer {
273
+ display: flex;
274
+ justify-content: flex-end;
275
+ align-items: center;
276
+ gap: var(--zn-spacing-small);
277
+ --icon-color: currentColor;
278
+ }
279
+