@kubex/zinc 1.1.68 → 1.1.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/custom-elements.json +1719 -282
  2. package/dist/vscode.html-custom-data.json +160 -29
  3. package/dist/web-types.json +395 -70
  4. package/dist/zn.d.ts +395 -16
  5. package/dist/zn.min.js +580 -408
  6. package/docs/pages/components/collapsible.md +6 -2
  7. package/docs/pages/components/icon-picker.md +14 -0
  8. package/docs/pages/components/input.md +19 -1
  9. package/docs/pages/components/preview-frame-demo.njk +33 -4
  10. package/docs/pages/components/preview-frame.md +20 -0
  11. package/docs/pages/components/theme-editor.md +303 -0
  12. package/docs/superpowers/plans/2026-08-03-theme-editor.md +1536 -0
  13. package/docs/superpowers/specs/2026-08-03-theme-editor-design.md +327 -0
  14. package/package.json +1 -1
  15. package/src/components/collapsible/collapsible.component.ts +21 -23
  16. package/src/components/dropdown/dropdown.component.ts +9 -0
  17. package/src/components/editor/editor.component.ts +20 -21
  18. package/src/components/file/file.component.ts +15 -0
  19. package/src/components/icon-picker/icon-picker.component.ts +150 -16
  20. package/src/components/icon-picker/icon-picker.scss +32 -0
  21. package/src/components/input/input.component.ts +44 -21
  22. package/src/components/input/input.scss +134 -42
  23. package/src/components/input/input.test.ts +45 -0
  24. package/src/components/preview-frame/preview-frame.component.ts +126 -16
  25. package/src/components/preview-frame/preview-frame.scss +27 -0
  26. package/src/components/preview-frame/preview-frame.test.ts +253 -0
  27. package/src/components/theme-editor/index.ts +12 -0
  28. package/src/components/theme-editor/theme-editor.component.ts +918 -0
  29. package/src/components/theme-editor/theme-editor.scss +309 -0
  30. package/src/components/theme-editor/theme-editor.test.ts +1752 -0
  31. package/src/events/events.ts +2 -0
  32. package/src/events/zn-theme-change.ts +13 -0
  33. package/src/events/zn-theme-submit.ts +9 -0
  34. package/src/types/web-test-runner-commands.d.ts +6 -0
  35. package/src/zinc.ts +1 -0
  36. package/tsconfig.json +7 -1
  37. package/web-test-runner.config.js +3 -1
@@ -5419,6 +5419,10 @@
5419
5419
  {
5420
5420
  "description": "The caption text.",
5421
5421
  "name": "caption"
5422
+ },
5423
+ {
5424
+ "description": "The expandable content wrapper.",
5425
+ "name": "content"
5422
5426
  }
5423
5427
  ],
5424
5428
  "slots": [
@@ -5561,7 +5565,7 @@
5561
5565
  "name": "observer",
5562
5566
  "privacy": "private",
5563
5567
  "readonly": true,
5564
- "default": "new MutationController(this, { target: null, config: {childList: true, subtree: true}, callback: () => this.recalculateNumberOfItems(), })"
5568
+ "default": "new MutationController(this, { target: null, config: { childList: true, subtree: true }, callback: () => this.recalculateNumberOfItems(), })"
5565
5569
  },
5566
5570
  {
5567
5571
  "kind": "field",
@@ -5682,7 +5686,7 @@
5682
5686
  "tagNameWithoutPrefix": "collapsible",
5683
5687
  "tagName": "zn-collapsible",
5684
5688
  "customElement": true,
5685
- "jsDoc": "/**\n * @summary Toggles between showing and hiding content when clicked\n * @documentation https://zinc.style/components/collapsible\n * @status experimental\n * @since 1.0\n *\n * @dependency zn-icon - The icon element\n *\n * @slot header - Clicking will toggle the show state of the data\n *\n * @csspart header - The header row (toggle).\n * @csspart caption - The caption text.\n */",
5689
+ "jsDoc": "/**\n * @summary Toggles between showing and hiding content when clicked\n * @documentation https://zinc.style/components/collapsible\n * @status experimental\n * @since 1.0\n *\n * @dependency zn-icon - The icon element\n *\n * @slot header - Clicking will toggle the show state of the data\n *\n * @csspart header - The header row (toggle).\n * @csspart caption - The caption text.\n * @csspart content - The expandable content wrapper.\n */",
5686
5690
  "documentation": "https://zinc.style/components/collapsible",
5687
5691
  "status": "experimental",
5688
5692
  "since": "1.0",
@@ -13559,6 +13563,11 @@
13559
13563
  "privacy": "private",
13560
13564
  "description": "Clear the current value after the user confirms."
13561
13565
  },
13566
+ {
13567
+ "kind": "method",
13568
+ "name": "clear",
13569
+ "description": "Programmatically clears the selected file and any external `src` without\nconfirmation. Unlike a user-initiated clear, this does not flag the control\nto submit an empty value."
13570
+ },
13562
13571
  {
13563
13572
  "kind": "method",
13564
13573
  "name": "updatePreview",
@@ -15590,6 +15599,272 @@
15590
15599
  }
15591
15600
  ]
15592
15601
  },
15602
+ {
15603
+ "kind": "javascript-module",
15604
+ "path": "components/header/header.js",
15605
+ "declarations": [
15606
+ {
15607
+ "kind": "class",
15608
+ "description": "",
15609
+ "name": "ZnHeader",
15610
+ "cssProperties": [
15611
+ {
15612
+ "description": "An example CSS custom property.",
15613
+ "name": "--example"
15614
+ }
15615
+ ],
15616
+ "cssParts": [
15617
+ {
15618
+ "description": "The component's base wrapper.",
15619
+ "name": "base"
15620
+ }
15621
+ ],
15622
+ "slots": [
15623
+ {
15624
+ "description": "The default slot.",
15625
+ "name": ""
15626
+ },
15627
+ {
15628
+ "description": "An example slot.",
15629
+ "name": "example"
15630
+ }
15631
+ ],
15632
+ "members": [
15633
+ {
15634
+ "kind": "field",
15635
+ "name": "hasSlotController",
15636
+ "privacy": "private",
15637
+ "readonly": true,
15638
+ "default": "new HasSlotController(this, '[default]', 'nav', 'breadcrumb')"
15639
+ },
15640
+ {
15641
+ "kind": "field",
15642
+ "name": "fullLocation",
15643
+ "type": {
15644
+ "text": "string"
15645
+ },
15646
+ "attribute": "full-location"
15647
+ },
15648
+ {
15649
+ "kind": "field",
15650
+ "name": "entityId",
15651
+ "type": {
15652
+ "text": "string"
15653
+ },
15654
+ "attribute": "entity-id"
15655
+ },
15656
+ {
15657
+ "kind": "field",
15658
+ "name": "entityIdShow",
15659
+ "type": {
15660
+ "text": "boolean"
15661
+ },
15662
+ "attribute": "entity-id-show"
15663
+ },
15664
+ {
15665
+ "kind": "field",
15666
+ "name": "transparent",
15667
+ "type": {
15668
+ "text": "boolean"
15669
+ },
15670
+ "default": "false",
15671
+ "attribute": "transparent"
15672
+ },
15673
+ {
15674
+ "kind": "field",
15675
+ "name": "caption",
15676
+ "type": {
15677
+ "text": "string"
15678
+ },
15679
+ "attribute": "caption"
15680
+ },
15681
+ {
15682
+ "kind": "field",
15683
+ "name": "icon",
15684
+ "type": {
15685
+ "text": "string"
15686
+ },
15687
+ "attribute": "icon"
15688
+ },
15689
+ {
15690
+ "kind": "field",
15691
+ "name": "navigation",
15692
+ "type": {
15693
+ "text": "array"
15694
+ },
15695
+ "default": "[]",
15696
+ "attribute": "navigation"
15697
+ },
15698
+ {
15699
+ "kind": "field",
15700
+ "name": "fullWidth",
15701
+ "type": {
15702
+ "text": "boolean"
15703
+ },
15704
+ "attribute": "full-width"
15705
+ },
15706
+ {
15707
+ "kind": "field",
15708
+ "name": "previousPath",
15709
+ "type": {
15710
+ "text": "string"
15711
+ },
15712
+ "attribute": "previous-path"
15713
+ },
15714
+ {
15715
+ "kind": "field",
15716
+ "name": "previousTarget",
15717
+ "type": {
15718
+ "text": "string"
15719
+ },
15720
+ "attribute": "previous-target"
15721
+ },
15722
+ {
15723
+ "kind": "field",
15724
+ "name": "hideBreadcrumb",
15725
+ "type": {
15726
+ "text": "boolean"
15727
+ },
15728
+ "default": "false",
15729
+ "attribute": "hide-breadcrumb"
15730
+ },
15731
+ {
15732
+ "kind": "field",
15733
+ "name": "navbar",
15734
+ "type": {
15735
+ "text": "ZnNavbar"
15736
+ },
15737
+ "privacy": "private"
15738
+ },
15739
+ {
15740
+ "kind": "field",
15741
+ "name": "handleAltPress"
15742
+ },
15743
+ {
15744
+ "kind": "field",
15745
+ "name": "handleAltUp"
15746
+ },
15747
+ {
15748
+ "kind": "method",
15749
+ "name": "updateNav"
15750
+ }
15751
+ ],
15752
+ "events": [
15753
+ {
15754
+ "description": "Emitted as an example.",
15755
+ "name": "zn-event-name"
15756
+ }
15757
+ ],
15758
+ "attributes": [
15759
+ {
15760
+ "name": "full-location",
15761
+ "type": {
15762
+ "text": "string"
15763
+ },
15764
+ "fieldName": "fullLocation"
15765
+ },
15766
+ {
15767
+ "name": "entity-id",
15768
+ "type": {
15769
+ "text": "string"
15770
+ },
15771
+ "fieldName": "entityId"
15772
+ },
15773
+ {
15774
+ "name": "entity-id-show",
15775
+ "type": {
15776
+ "text": "boolean"
15777
+ },
15778
+ "fieldName": "entityIdShow"
15779
+ },
15780
+ {
15781
+ "name": "transparent",
15782
+ "type": {
15783
+ "text": "boolean"
15784
+ },
15785
+ "default": "false",
15786
+ "fieldName": "transparent"
15787
+ },
15788
+ {
15789
+ "name": "caption",
15790
+ "type": {
15791
+ "text": "string"
15792
+ },
15793
+ "fieldName": "caption"
15794
+ },
15795
+ {
15796
+ "name": "icon",
15797
+ "type": {
15798
+ "text": "string"
15799
+ },
15800
+ "fieldName": "icon"
15801
+ },
15802
+ {
15803
+ "name": "navigation",
15804
+ "type": {
15805
+ "text": "array"
15806
+ },
15807
+ "default": "[]",
15808
+ "fieldName": "navigation"
15809
+ },
15810
+ {
15811
+ "name": "full-width",
15812
+ "type": {
15813
+ "text": "boolean"
15814
+ },
15815
+ "fieldName": "fullWidth"
15816
+ },
15817
+ {
15818
+ "name": "previous-path",
15819
+ "type": {
15820
+ "text": "string"
15821
+ },
15822
+ "fieldName": "previousPath"
15823
+ },
15824
+ {
15825
+ "name": "previous-target",
15826
+ "type": {
15827
+ "text": "string"
15828
+ },
15829
+ "fieldName": "previousTarget"
15830
+ },
15831
+ {
15832
+ "name": "hide-breadcrumb",
15833
+ "type": {
15834
+ "text": "boolean"
15835
+ },
15836
+ "default": "false",
15837
+ "fieldName": "hideBreadcrumb"
15838
+ }
15839
+ ],
15840
+ "superclass": {
15841
+ "name": "ZincElement",
15842
+ "module": "/src/internal/zinc-element"
15843
+ },
15844
+ "summary": "Short summary of the component's intended use.",
15845
+ "tagNameWithoutPrefix": "header",
15846
+ "tagName": "zn-header",
15847
+ "customElement": true,
15848
+ "jsDoc": "/**\n * @summary Short summary of the component's intended use.\n * @documentation https://zinc.style/components/header\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 */",
15849
+ "documentation": "https://zinc.style/components/header",
15850
+ "status": "experimental",
15851
+ "since": "1.0",
15852
+ "dependencies": [
15853
+ "zn-example"
15854
+ ]
15855
+ }
15856
+ ],
15857
+ "exports": [
15858
+ {
15859
+ "kind": "js",
15860
+ "name": "default",
15861
+ "declaration": {
15862
+ "name": "ZnHeader",
15863
+ "module": "components/header/header.js"
15864
+ }
15865
+ }
15866
+ ]
15867
+ },
15593
15868
  {
15594
15869
  "kind": "javascript-module",
15595
15870
  "path": "components/hover-container/hover-container.js",
@@ -15893,272 +16168,6 @@
15893
16168
  }
15894
16169
  ]
15895
16170
  },
15896
- {
15897
- "kind": "javascript-module",
15898
- "path": "components/header/header.js",
15899
- "declarations": [
15900
- {
15901
- "kind": "class",
15902
- "description": "",
15903
- "name": "ZnHeader",
15904
- "cssProperties": [
15905
- {
15906
- "description": "An example CSS custom property.",
15907
- "name": "--example"
15908
- }
15909
- ],
15910
- "cssParts": [
15911
- {
15912
- "description": "The component's base wrapper.",
15913
- "name": "base"
15914
- }
15915
- ],
15916
- "slots": [
15917
- {
15918
- "description": "The default slot.",
15919
- "name": ""
15920
- },
15921
- {
15922
- "description": "An example slot.",
15923
- "name": "example"
15924
- }
15925
- ],
15926
- "members": [
15927
- {
15928
- "kind": "field",
15929
- "name": "hasSlotController",
15930
- "privacy": "private",
15931
- "readonly": true,
15932
- "default": "new HasSlotController(this, '[default]', 'nav', 'breadcrumb')"
15933
- },
15934
- {
15935
- "kind": "field",
15936
- "name": "fullLocation",
15937
- "type": {
15938
- "text": "string"
15939
- },
15940
- "attribute": "full-location"
15941
- },
15942
- {
15943
- "kind": "field",
15944
- "name": "entityId",
15945
- "type": {
15946
- "text": "string"
15947
- },
15948
- "attribute": "entity-id"
15949
- },
15950
- {
15951
- "kind": "field",
15952
- "name": "entityIdShow",
15953
- "type": {
15954
- "text": "boolean"
15955
- },
15956
- "attribute": "entity-id-show"
15957
- },
15958
- {
15959
- "kind": "field",
15960
- "name": "transparent",
15961
- "type": {
15962
- "text": "boolean"
15963
- },
15964
- "default": "false",
15965
- "attribute": "transparent"
15966
- },
15967
- {
15968
- "kind": "field",
15969
- "name": "caption",
15970
- "type": {
15971
- "text": "string"
15972
- },
15973
- "attribute": "caption"
15974
- },
15975
- {
15976
- "kind": "field",
15977
- "name": "icon",
15978
- "type": {
15979
- "text": "string"
15980
- },
15981
- "attribute": "icon"
15982
- },
15983
- {
15984
- "kind": "field",
15985
- "name": "navigation",
15986
- "type": {
15987
- "text": "array"
15988
- },
15989
- "default": "[]",
15990
- "attribute": "navigation"
15991
- },
15992
- {
15993
- "kind": "field",
15994
- "name": "fullWidth",
15995
- "type": {
15996
- "text": "boolean"
15997
- },
15998
- "attribute": "full-width"
15999
- },
16000
- {
16001
- "kind": "field",
16002
- "name": "previousPath",
16003
- "type": {
16004
- "text": "string"
16005
- },
16006
- "attribute": "previous-path"
16007
- },
16008
- {
16009
- "kind": "field",
16010
- "name": "previousTarget",
16011
- "type": {
16012
- "text": "string"
16013
- },
16014
- "attribute": "previous-target"
16015
- },
16016
- {
16017
- "kind": "field",
16018
- "name": "hideBreadcrumb",
16019
- "type": {
16020
- "text": "boolean"
16021
- },
16022
- "default": "false",
16023
- "attribute": "hide-breadcrumb"
16024
- },
16025
- {
16026
- "kind": "field",
16027
- "name": "navbar",
16028
- "type": {
16029
- "text": "ZnNavbar"
16030
- },
16031
- "privacy": "private"
16032
- },
16033
- {
16034
- "kind": "field",
16035
- "name": "handleAltPress"
16036
- },
16037
- {
16038
- "kind": "field",
16039
- "name": "handleAltUp"
16040
- },
16041
- {
16042
- "kind": "method",
16043
- "name": "updateNav"
16044
- }
16045
- ],
16046
- "events": [
16047
- {
16048
- "description": "Emitted as an example.",
16049
- "name": "zn-event-name"
16050
- }
16051
- ],
16052
- "attributes": [
16053
- {
16054
- "name": "full-location",
16055
- "type": {
16056
- "text": "string"
16057
- },
16058
- "fieldName": "fullLocation"
16059
- },
16060
- {
16061
- "name": "entity-id",
16062
- "type": {
16063
- "text": "string"
16064
- },
16065
- "fieldName": "entityId"
16066
- },
16067
- {
16068
- "name": "entity-id-show",
16069
- "type": {
16070
- "text": "boolean"
16071
- },
16072
- "fieldName": "entityIdShow"
16073
- },
16074
- {
16075
- "name": "transparent",
16076
- "type": {
16077
- "text": "boolean"
16078
- },
16079
- "default": "false",
16080
- "fieldName": "transparent"
16081
- },
16082
- {
16083
- "name": "caption",
16084
- "type": {
16085
- "text": "string"
16086
- },
16087
- "fieldName": "caption"
16088
- },
16089
- {
16090
- "name": "icon",
16091
- "type": {
16092
- "text": "string"
16093
- },
16094
- "fieldName": "icon"
16095
- },
16096
- {
16097
- "name": "navigation",
16098
- "type": {
16099
- "text": "array"
16100
- },
16101
- "default": "[]",
16102
- "fieldName": "navigation"
16103
- },
16104
- {
16105
- "name": "full-width",
16106
- "type": {
16107
- "text": "boolean"
16108
- },
16109
- "fieldName": "fullWidth"
16110
- },
16111
- {
16112
- "name": "previous-path",
16113
- "type": {
16114
- "text": "string"
16115
- },
16116
- "fieldName": "previousPath"
16117
- },
16118
- {
16119
- "name": "previous-target",
16120
- "type": {
16121
- "text": "string"
16122
- },
16123
- "fieldName": "previousTarget"
16124
- },
16125
- {
16126
- "name": "hide-breadcrumb",
16127
- "type": {
16128
- "text": "boolean"
16129
- },
16130
- "default": "false",
16131
- "fieldName": "hideBreadcrumb"
16132
- }
16133
- ],
16134
- "superclass": {
16135
- "name": "ZincElement",
16136
- "module": "/src/internal/zinc-element"
16137
- },
16138
- "summary": "Short summary of the component's intended use.",
16139
- "tagNameWithoutPrefix": "header",
16140
- "tagName": "zn-header",
16141
- "customElement": true,
16142
- "jsDoc": "/**\n * @summary Short summary of the component's intended use.\n * @documentation https://zinc.style/components/header\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 */",
16143
- "documentation": "https://zinc.style/components/header",
16144
- "status": "experimental",
16145
- "since": "1.0",
16146
- "dependencies": [
16147
- "zn-example"
16148
- ]
16149
- }
16150
- ],
16151
- "exports": [
16152
- {
16153
- "kind": "js",
16154
- "name": "default",
16155
- "declaration": {
16156
- "name": "ZnHeader",
16157
- "module": "components/header/header.js"
16158
- }
16159
- }
16160
- ]
16161
- },
16162
16171
  {
16163
16172
  "kind": "javascript-module",
16164
16173
  "path": "components/icon/icon.js",
@@ -16679,7 +16688,7 @@
16679
16688
  "name": "formControlController",
16680
16689
  "privacy": "private",
16681
16690
  "readonly": true,
16682
- "default": "new FormControlController(this, { assumeInteractionOn: ['zn-change'] })"
16691
+ "default": "new FormControlController(this, { assumeInteractionOn: ['zn-change'], // With allow-upload, a chosen file is submitted under `name` in place of // the icon string — the two are mutually exclusive. value: (el: ZnIconPicker) => el._file ?? el.icon })"
16683
16692
  },
16684
16693
  {
16685
16694
  "kind": "field",
@@ -16714,7 +16723,7 @@
16714
16723
  "type": {
16715
16724
  "text": "string"
16716
16725
  },
16717
- "default": "'material'",
16726
+ "default": "'material-symbols-outlined'",
16718
16727
  "attribute": "library"
16719
16728
  },
16720
16729
  {
@@ -16773,6 +16782,33 @@
16773
16782
  "attribute": "required",
16774
16783
  "reflects": true
16775
16784
  },
16785
+ {
16786
+ "kind": "field",
16787
+ "name": "triggerSubmit",
16788
+ "type": {
16789
+ "text": "boolean"
16790
+ },
16791
+ "default": "false",
16792
+ "attribute": "trigger-submit"
16793
+ },
16794
+ {
16795
+ "kind": "field",
16796
+ "name": "allowUpload",
16797
+ "type": {
16798
+ "text": "boolean"
16799
+ },
16800
+ "default": "false",
16801
+ "attribute": "allow-upload"
16802
+ },
16803
+ {
16804
+ "kind": "field",
16805
+ "name": "accept",
16806
+ "type": {
16807
+ "text": "string"
16808
+ },
16809
+ "default": "'image/*'",
16810
+ "attribute": "accept"
16811
+ },
16776
16812
  {
16777
16813
  "kind": "field",
16778
16814
  "name": "form",
@@ -16853,6 +16889,51 @@
16853
16889
  "privacy": "private",
16854
16890
  "default": "''"
16855
16891
  },
16892
+ {
16893
+ "kind": "field",
16894
+ "name": "_pendingFile",
16895
+ "type": {
16896
+ "text": "File | null"
16897
+ },
16898
+ "privacy": "private",
16899
+ "default": "null"
16900
+ },
16901
+ {
16902
+ "kind": "field",
16903
+ "name": "_pendingFileUrl",
16904
+ "type": {
16905
+ "text": "string | null"
16906
+ },
16907
+ "privacy": "private",
16908
+ "default": "null"
16909
+ },
16910
+ {
16911
+ "kind": "field",
16912
+ "name": "_mode",
16913
+ "type": {
16914
+ "text": "'icon' | 'upload'"
16915
+ },
16916
+ "privacy": "private",
16917
+ "default": "'icon'"
16918
+ },
16919
+ {
16920
+ "kind": "field",
16921
+ "name": "_file",
16922
+ "type": {
16923
+ "text": "File | null"
16924
+ },
16925
+ "privacy": "private",
16926
+ "default": "null"
16927
+ },
16928
+ {
16929
+ "kind": "field",
16930
+ "name": "_fileUrl",
16931
+ "type": {
16932
+ "text": "string | null"
16933
+ },
16934
+ "privacy": "private",
16935
+ "default": "null"
16936
+ },
16856
16937
  {
16857
16938
  "kind": "field",
16858
16939
  "name": "_dialog",
@@ -16861,6 +16942,14 @@
16861
16942
  },
16862
16943
  "privacy": "private"
16863
16944
  },
16945
+ {
16946
+ "kind": "field",
16947
+ "name": "_fileInput",
16948
+ "type": {
16949
+ "text": "HTMLInputElement"
16950
+ },
16951
+ "privacy": "private"
16952
+ },
16864
16953
  {
16865
16954
  "kind": "field",
16866
16955
  "name": "value",
@@ -16868,6 +16957,24 @@
16868
16957
  "text": "string"
16869
16958
  }
16870
16959
  },
16960
+ {
16961
+ "kind": "field",
16962
+ "name": "file",
16963
+ "type": {
16964
+ "text": "File | null"
16965
+ },
16966
+ "description": "The chosen file when the user uploaded an image instead of picking an icon.",
16967
+ "readonly": true
16968
+ },
16969
+ {
16970
+ "kind": "field",
16971
+ "name": "isImageValue",
16972
+ "type": {
16973
+ "text": "boolean"
16974
+ },
16975
+ "description": "True when the current value renders as an image (an uploaded file or a URL) rather than a library icon.",
16976
+ "readonly": true
16977
+ },
16871
16978
  {
16872
16979
  "kind": "field",
16873
16980
  "name": "validity",
@@ -16987,6 +17094,29 @@
16987
17094
  "name": "handleCancel",
16988
17095
  "privacy": "private"
16989
17096
  },
17097
+ {
17098
+ "kind": "method",
17099
+ "name": "handleFileSelect",
17100
+ "privacy": "private",
17101
+ "parameters": [
17102
+ {
17103
+ "name": "e",
17104
+ "type": {
17105
+ "text": "Event"
17106
+ }
17107
+ }
17108
+ ]
17109
+ },
17110
+ {
17111
+ "kind": "method",
17112
+ "name": "discardPendingFile",
17113
+ "privacy": "private"
17114
+ },
17115
+ {
17116
+ "kind": "method",
17117
+ "name": "clearFile",
17118
+ "privacy": "private"
17119
+ },
16990
17120
  {
16991
17121
  "kind": "method",
16992
17122
  "name": "handleSearchInput",
@@ -17106,7 +17236,7 @@
17106
17236
  "type": {
17107
17237
  "text": "string"
17108
17238
  },
17109
- "default": "'material'",
17239
+ "default": "'material-symbols-outlined'",
17110
17240
  "fieldName": "library"
17111
17241
  },
17112
17242
  {
@@ -17157,6 +17287,30 @@
17157
17287
  "default": "false",
17158
17288
  "fieldName": "required"
17159
17289
  },
17290
+ {
17291
+ "name": "trigger-submit",
17292
+ "type": {
17293
+ "text": "boolean"
17294
+ },
17295
+ "default": "false",
17296
+ "fieldName": "triggerSubmit"
17297
+ },
17298
+ {
17299
+ "name": "allow-upload",
17300
+ "type": {
17301
+ "text": "boolean"
17302
+ },
17303
+ "default": "false",
17304
+ "fieldName": "allowUpload"
17305
+ },
17306
+ {
17307
+ "name": "accept",
17308
+ "type": {
17309
+ "text": "string"
17310
+ },
17311
+ "default": "'image/*'",
17312
+ "fieldName": "accept"
17313
+ },
17160
17314
  {
17161
17315
  "name": "form",
17162
17316
  "type": {
@@ -17990,6 +18144,28 @@
17990
18144
  "kind": "class",
17991
18145
  "description": "",
17992
18146
  "name": "ZnInput",
18147
+ "cssProperties": [
18148
+ {
18149
+ "description": "The height of a range input's track.",
18150
+ "name": "--zn-range-track-height"
18151
+ },
18152
+ {
18153
+ "description": "The color of a range input's track.",
18154
+ "name": "--zn-range-track-color"
18155
+ },
18156
+ {
18157
+ "description": "The diameter of a range input's thumb.",
18158
+ "name": "--zn-range-thumb-size"
18159
+ },
18160
+ {
18161
+ "description": "The color of a range input's thumb.",
18162
+ "name": "--zn-range-thumb-color"
18163
+ },
18164
+ {
18165
+ "description": "The width of the ring drawn around a range input's thumb.",
18166
+ "name": "--zn-range-thumb-ring-width"
18167
+ }
18168
+ ],
17993
18169
  "cssParts": [
17994
18170
  {
17995
18171
  "description": "The form control that wraps the label, input, and help text.",
@@ -18042,7 +18218,7 @@
18042
18218
  "name": "label-tooltip"
18043
18219
  },
18044
18220
  {
18045
- "description": "Used to add contextual text that is displayed above the input, on the right. Alternatively, you can use the `context-note` attribute.",
18221
+ "description": "Used to add contextual text that is displayed above the input, on the right. Alternatively, you can use the `context-note` attribute. Range inputs display their live value here unless this is set.",
18046
18222
  "name": "context-note"
18047
18223
  },
18048
18224
  {
@@ -18156,7 +18332,7 @@
18156
18332
  "kind": "field",
18157
18333
  "name": "type",
18158
18334
  "type": {
18159
- "text": "'color' | 'currency' | 'date' | 'datetime-local' | 'email' | 'number' | 'password' |\n 'search' | 'tel' | 'text' | 'time' | 'url'"
18335
+ "text": "'color' | 'currency' | 'date' | 'datetime-local' | 'email' | 'number' | 'password' |\n 'range' | 'search' | 'tel' | 'text' | 'time' | 'url'"
18160
18336
  },
18161
18337
  "default": "'text'",
18162
18338
  "description": "The type of input. Works the same as native `<input>` element. But only a subset of types is supported. Defaults\nto `text`",
@@ -18358,6 +18534,16 @@
18358
18534
  "description": "The color format to display for color inputs. Only applies when type is 'color'. *",
18359
18535
  "attribute": "color-format"
18360
18536
  },
18537
+ {
18538
+ "kind": "field",
18539
+ "name": "valueSuffix",
18540
+ "type": {
18541
+ "text": "string"
18542
+ },
18543
+ "default": "''",
18544
+ "description": "Appended to the value that range inputs display above the track, on the right, e.g. `rem`. Only applies when type\nis 'range' and no `context-note` is set.",
18545
+ "attribute": "value-suffix"
18546
+ },
18361
18547
  {
18362
18548
  "kind": "field",
18363
18549
  "name": "form",
@@ -18962,7 +19148,7 @@
18962
19148
  {
18963
19149
  "name": "type",
18964
19150
  "type": {
18965
- "text": "'color' | 'currency' | 'date' | 'datetime-local' | 'email' | 'number' | 'password' |\n 'search' | 'tel' | 'text' | 'time' | 'url'"
19151
+ "text": "'color' | 'currency' | 'date' | 'datetime-local' | 'email' | 'number' | 'password' |\n 'range' | 'search' | 'tel' | 'text' | 'time' | 'url'"
18966
19152
  },
18967
19153
  "default": "'text'",
18968
19154
  "description": "The type of input. Works the same as native `<input>` element. But only a subset of types is supported. Defaults\nto `text`",
@@ -19130,6 +19316,15 @@
19130
19316
  "description": "The color format to display for color inputs. Only applies when type is 'color'. *",
19131
19317
  "fieldName": "colorFormat"
19132
19318
  },
19319
+ {
19320
+ "name": "value-suffix",
19321
+ "type": {
19322
+ "text": "string"
19323
+ },
19324
+ "default": "''",
19325
+ "description": "Appended to the value that range inputs display above the track, on the right, e.g. `rem`. Only applies when type\nis 'range' and no `context-note` is set.",
19326
+ "fieldName": "valueSuffix"
19327
+ },
19133
19328
  {
19134
19329
  "name": "form",
19135
19330
  "type": {
@@ -19270,7 +19465,7 @@
19270
19465
  "tagNameWithoutPrefix": "input",
19271
19466
  "tagName": "zn-input",
19272
19467
  "customElement": true,
19273
- "jsDoc": "/**\n * @summary Short summary of the component's intended use.\n * @documentation https://zinc.style/components/input\n * @status experimental\n * @since 1.0\n *\n * @dependency zn-icon\n * @dependency zn-tooltip\n *\n * @event zn-blur - Emitted when the control loses focus.\n * @event zn-change - Emitted when an alteration to the control's value is committed by the user.\n * @event zn-clear - Emitted when the clear button is activated.\n * @event zn-focus - Emitted when the control gains focus.\n * @event zn-input - Emitted when the control receives input.\n * @event zn-invalid - Emitted when the form control has been checked for validity and its constraints aren't satisfied.\n *\n * @slot label - The input's label. Alternatively, you can use the `label` attribute.\n * @slot label-tooltip - Used to add text that is displayed in a tooltip next to the label. Alternatively, you can use the `label-tooltip` attribute.\n * @slot context-note - Used to add contextual text that is displayed above the input, on the right. Alternatively, you can use the `context-note` attribute.\n * @slot prefix - Used to prepend a presentational icon or similar element to the input.\n * @slot suffix - Used to append a presentational icon or similar element to the input.\n * @slot clear-icon - An icon to use in lieu of the default clear icon.\n * @slot show-password-icon - An icon to use in lieu of the default show password icon.\n * @slot hide-password-icon - An icon to use in lieu of the default hide password icon.\n * @slot help-text - Text that describes how to use the input. Alternatively, you can use the `help-text` attribute.\n *\n * @csspart form-control - The form control that wraps the label, input, and help text.\n * @csspart form-control-label - The label's wrapper.\n * @csspart form-control-input - The input's wrapper.\n * @csspart form-control-help-text - The help text's wrapper.\n * @csspart base - The component's base wrapper.\n * @csspart input - The internal `<input>` control.\n * @csspart prefix - The container that wraps the prefix.\n * @csspart clear-button - The clear button.\n * @csspart password-toggle-button - The password toggle button.\n * @csspart suffix - The container that wraps the suffix.\n */",
19468
+ "jsDoc": "/**\n * @summary Short summary of the component's intended use.\n * @documentation https://zinc.style/components/input\n * @status experimental\n * @since 1.0\n *\n * @dependency zn-icon\n * @dependency zn-tooltip\n *\n * @event zn-blur - Emitted when the control loses focus.\n * @event zn-change - Emitted when an alteration to the control's value is committed by the user.\n * @event zn-clear - Emitted when the clear button is activated.\n * @event zn-focus - Emitted when the control gains focus.\n * @event zn-input - Emitted when the control receives input.\n * @event zn-invalid - Emitted when the form control has been checked for validity and its constraints aren't satisfied.\n *\n * @slot label - The input's label. Alternatively, you can use the `label` attribute.\n * @slot label-tooltip - Used to add text that is displayed in a tooltip next to the label. Alternatively, you can use the `label-tooltip` attribute.\n * @slot context-note - Used to add contextual text that is displayed above the input, on the right. Alternatively, you can use the `context-note` attribute. Range inputs display their live value here unless this is set.\n * @slot prefix - Used to prepend a presentational icon or similar element to the input.\n * @slot suffix - Used to append a presentational icon or similar element to the input.\n * @slot clear-icon - An icon to use in lieu of the default clear icon.\n * @slot show-password-icon - An icon to use in lieu of the default show password icon.\n * @slot hide-password-icon - An icon to use in lieu of the default hide password icon.\n * @slot help-text - Text that describes how to use the input. Alternatively, you can use the `help-text` attribute.\n *\n * @csspart form-control - The form control that wraps the label, input, and help text.\n * @csspart form-control-label - The label's wrapper.\n * @csspart form-control-input - The input's wrapper.\n * @csspart form-control-help-text - The help text's wrapper.\n * @csspart base - The component's base wrapper.\n * @csspart input - The internal `<input>` control.\n * @csspart prefix - The container that wraps the prefix.\n * @csspart clear-button - The clear button.\n * @csspart password-toggle-button - The password toggle button.\n * @csspart suffix - The container that wraps the suffix.\n *\n * @cssproperty --zn-range-track-height - The height of a range input's track.\n * @cssproperty --zn-range-track-color - The color of a range input's track.\n * @cssproperty --zn-range-thumb-size - The diameter of a range input's thumb.\n * @cssproperty --zn-range-thumb-color - The color of a range input's thumb.\n * @cssproperty --zn-range-thumb-ring-width - The width of the ring drawn around a range input's thumb.\n */",
19274
19469
  "documentation": "https://zinc.style/components/input",
19275
19470
  "status": "experimental",
19276
19471
  "since": "1.0",
@@ -28398,11 +28593,25 @@
28398
28593
  "kind": "class",
28399
28594
  "description": "",
28400
28595
  "name": "ZnPreviewFrame",
28596
+ "cssProperties": [
28597
+ {
28598
+ "description": "Spacing of the backdrop dot grid (`backdrop=\"dots\"`). Defaults to 20px.",
28599
+ "name": "--zn-preview-frame-dot-spacing"
28600
+ },
28601
+ {
28602
+ "description": "Opacity of the backdrop dots (`backdrop=\"dots\"`). Defaults to 0.08.",
28603
+ "name": "--zn-preview-frame-dot-opacity"
28604
+ }
28605
+ ],
28401
28606
  "cssParts": [
28402
28607
  {
28403
28608
  "description": "The component's base wrapper.",
28404
28609
  "name": "base"
28405
28610
  },
28611
+ {
28612
+ "description": "The device-width wrapper around the iframe.",
28613
+ "name": "stage"
28614
+ },
28406
28615
  {
28407
28616
  "description": "The preview iframe.",
28408
28617
  "name": "iframe"
@@ -28453,6 +28662,16 @@
28453
28662
  "description": "Selector (resolved against the component's root node) for the forms to watch.\nDefaults to only forms explicitly opted in via a `data-auto-save` attribute —\nunmarked forms keep normal submit behavior and are never intercepted,\nauto-saved, or used to trigger a preview refresh. Override to widen the scope.",
28454
28663
  "attribute": "watch"
28455
28664
  },
28665
+ {
28666
+ "kind": "field",
28667
+ "name": "refreshOn",
28668
+ "type": {
28669
+ "text": "string"
28670
+ },
28671
+ "default": "'form'",
28672
+ "description": "Selector for forms whose saves are left to the shell but should still\nrefresh the preview. These are never intercepted: the shell submits them\n(so its own response handling — alerts, refreshes — runs as normal) and the\npreview re-fetches its config once the shell reports the save complete.\nSet empty to disable.",
28673
+ "attribute": "refresh-on"
28674
+ },
28456
28675
  {
28457
28676
  "kind": "field",
28458
28677
  "name": "debounce",
@@ -28470,7 +28689,7 @@
28470
28689
  "text": "number"
28471
28690
  },
28472
28691
  "default": "1",
28473
- "description": "Zooms the previewed page out (0–1]. The frame always fills the panel;\nzoom shrinks the content browser-style, so 0.4 shows the page at 40%\nsize with correspondingly more of it visible. 1 = natural size.",
28692
+ "description": "Zooms the previewed page out (0–1]. The frame always fills the panel;\nzoom shrinks the content browser-style, so 0.4 shows the page at 40%\nsize with correspondingly more of it visible. 1 = natural size.\nIgnored when `fill` is set.",
28474
28693
  "attribute": "zoom"
28475
28694
  },
28476
28695
  {
@@ -28480,9 +28699,41 @@
28480
28699
  "text": "number"
28481
28700
  },
28482
28701
  "default": "480",
28483
- "description": "The visible height (in CSS pixels) of the preview panel. Fixed rather\nthan measured, because a measured height would feed back into the\nscaled iframe's layout box and grow unbounded.",
28702
+ "description": "The visible height (in CSS pixels) of the preview panel. Fixed rather\nthan measured, because a measured height would feed back into the\nscaled iframe's layout box and grow unbounded. With `fill` set, this\nbecomes a `min-height` floor instead of the height.",
28484
28703
  "attribute": "min-height"
28485
28704
  },
28705
+ {
28706
+ "kind": "field",
28707
+ "name": "fill",
28708
+ "type": {
28709
+ "text": "boolean"
28710
+ },
28711
+ "default": "false",
28712
+ "description": "Fills the panel's own column height instead of using a fixed\n`min-height` pixel height — for hosts (like zn-theme-editor) whose\nlayout already stretches the column to match a taller sibling.\n`zoom` is ignored when set: its oversize maths depends on a known\npixel height, which `fill` deliberately doesn't have.",
28713
+ "attribute": "fill"
28714
+ },
28715
+ {
28716
+ "kind": "field",
28717
+ "name": "device",
28718
+ "type": {
28719
+ "text": "PreviewFrameDevice"
28720
+ },
28721
+ "default": "'desktop'",
28722
+ "description": "Constrains and centres the preview to a device width: `desktop` (100%),\n`tablet` (768px) or `mobile` (390px). The iframe element itself is\nnarrowed, so the embedded page's own media queries fire.",
28723
+ "attribute": "device",
28724
+ "reflects": true
28725
+ },
28726
+ {
28727
+ "kind": "field",
28728
+ "name": "backdrop",
28729
+ "type": {
28730
+ "text": "'dots' | 'panel'"
28731
+ },
28732
+ "default": "'dots'",
28733
+ "description": "Backdrop behind the stage: `dots` (default) is the canvas dot grid; `panel` is a plain `rgb(var(--zn-panel))` fill.",
28734
+ "attribute": "backdrop",
28735
+ "reflects": true
28736
+ },
28486
28737
  {
28487
28738
  "kind": "field",
28488
28739
  "name": "frame",
@@ -28508,6 +28759,14 @@
28508
28759
  "privacy": "private",
28509
28760
  "default": "0"
28510
28761
  },
28762
+ {
28763
+ "kind": "field",
28764
+ "name": "_theme",
28765
+ "type": {
28766
+ "text": "Record<string, unknown> | undefined"
28767
+ },
28768
+ "privacy": "private"
28769
+ },
28511
28770
  {
28512
28771
  "kind": "field",
28513
28772
  "name": "_watchedForms",
@@ -28515,6 +28774,13 @@
28515
28774
  "readonly": true,
28516
28775
  "default": "new Set<HTMLFormElement>()"
28517
28776
  },
28777
+ {
28778
+ "kind": "field",
28779
+ "name": "_refreshForms",
28780
+ "privacy": "private",
28781
+ "readonly": true,
28782
+ "default": "new Set<HTMLFormElement>()"
28783
+ },
28518
28784
  {
28519
28785
  "kind": "field",
28520
28786
  "name": "_debounceTimers",
@@ -28540,6 +28806,24 @@
28540
28806
  "name": "refresh",
28541
28807
  "description": "Re-fetches the payload and pushes a fresh config to the preview."
28542
28808
  },
28809
+ {
28810
+ "kind": "method",
28811
+ "name": "setTheme",
28812
+ "parameters": [
28813
+ {
28814
+ "name": "theme",
28815
+ "type": {
28816
+ "text": "Record<string, unknown>"
28817
+ }
28818
+ }
28819
+ ],
28820
+ "description": "Pushes a theme payload into the preview. The payload is retained and\nre-posted after every ready handshake, so a frame reload doesn't drop an\nin-progress theme."
28821
+ },
28822
+ {
28823
+ "kind": "method",
28824
+ "name": "_postTheme",
28825
+ "privacy": "private"
28826
+ },
28543
28827
  {
28544
28828
  "kind": "method",
28545
28829
  "name": "_sendConfig",
@@ -28550,6 +28834,12 @@
28550
28834
  "name": "_attachForms",
28551
28835
  "privacy": "private"
28552
28836
  },
28837
+ {
28838
+ "kind": "field",
28839
+ "name": "_onShellSave",
28840
+ "privacy": "private",
28841
+ "readonly": true
28842
+ },
28553
28843
  {
28554
28844
  "kind": "method",
28555
28845
  "name": "_detachForm",
@@ -28645,6 +28935,15 @@
28645
28935
  "description": "Selector (resolved against the component's root node) for the forms to watch.\nDefaults to only forms explicitly opted in via a `data-auto-save` attribute —\nunmarked forms keep normal submit behavior and are never intercepted,\nauto-saved, or used to trigger a preview refresh. Override to widen the scope.",
28646
28936
  "fieldName": "watch"
28647
28937
  },
28938
+ {
28939
+ "name": "refresh-on",
28940
+ "type": {
28941
+ "text": "string"
28942
+ },
28943
+ "default": "'form'",
28944
+ "description": "Selector for forms whose saves are left to the shell but should still\nrefresh the preview. These are never intercepted: the shell submits them\n(so its own response handling — alerts, refreshes — runs as normal) and the\npreview re-fetches its config once the shell reports the save complete.\nSet empty to disable.",
28945
+ "fieldName": "refreshOn"
28946
+ },
28648
28947
  {
28649
28948
  "name": "debounce",
28650
28949
  "type": {
@@ -28660,7 +28959,7 @@
28660
28959
  "text": "number"
28661
28960
  },
28662
28961
  "default": "1",
28663
- "description": "Zooms the previewed page out (0–1]. The frame always fills the panel;\nzoom shrinks the content browser-style, so 0.4 shows the page at 40%\nsize with correspondingly more of it visible. 1 = natural size.",
28962
+ "description": "Zooms the previewed page out (0–1]. The frame always fills the panel;\nzoom shrinks the content browser-style, so 0.4 shows the page at 40%\nsize with correspondingly more of it visible. 1 = natural size.\nIgnored when `fill` is set.",
28664
28963
  "fieldName": "zoom"
28665
28964
  },
28666
28965
  {
@@ -28669,19 +28968,46 @@
28669
28968
  "text": "number"
28670
28969
  },
28671
28970
  "default": "480",
28672
- "description": "The visible height (in CSS pixels) of the preview panel. Fixed rather\nthan measured, because a measured height would feed back into the\nscaled iframe's layout box and grow unbounded.",
28971
+ "description": "The visible height (in CSS pixels) of the preview panel. Fixed rather\nthan measured, because a measured height would feed back into the\nscaled iframe's layout box and grow unbounded. With `fill` set, this\nbecomes a `min-height` floor instead of the height.",
28673
28972
  "fieldName": "minHeight"
28973
+ },
28974
+ {
28975
+ "name": "fill",
28976
+ "type": {
28977
+ "text": "boolean"
28978
+ },
28979
+ "default": "false",
28980
+ "description": "Fills the panel's own column height instead of using a fixed\n`min-height` pixel height — for hosts (like zn-theme-editor) whose\nlayout already stretches the column to match a taller sibling.\n`zoom` is ignored when set: its oversize maths depends on a known\npixel height, which `fill` deliberately doesn't have.",
28981
+ "fieldName": "fill"
28982
+ },
28983
+ {
28984
+ "name": "device",
28985
+ "type": {
28986
+ "text": "PreviewFrameDevice"
28987
+ },
28988
+ "default": "'desktop'",
28989
+ "description": "Constrains and centres the preview to a device width: `desktop` (100%),\n`tablet` (768px) or `mobile` (390px). The iframe element itself is\nnarrowed, so the embedded page's own media queries fire.",
28990
+ "fieldName": "device"
28991
+ },
28992
+ {
28993
+ "name": "backdrop",
28994
+ "type": {
28995
+ "text": "'dots' | 'panel'"
28996
+ },
28997
+ "default": "'dots'",
28998
+ "description": "Backdrop behind the stage: `dots` (default) is the canvas dot grid; `panel` is a plain `rgb(var(--zn-panel))` fill.",
28999
+ "fieldName": "backdrop"
28674
29000
  }
28675
29001
  ],
28676
29002
  "superclass": {
28677
29003
  "name": "ZincElement",
28678
29004
  "module": "/src/internal/zinc-element"
28679
29005
  },
28680
- "summary": "Embeds a live preview iframe and drives the hp-preview postMessage\nprotocol: answers the frame's ready handshake with a config payload fetched\nfrom data-uri, auto-saves watched forms on change, and refreshes the\npreview after each save.",
29006
+ "summary": "Embeds a live preview iframe and drives the hp-preview postMessage\nprotocol: answers the frame's ready handshake with a config payload fetched\nfrom data-uri, auto-saves watched forms on change, refreshes the preview\nafter each save (its own, or a shell-driven save of a `refresh-on` form),\nand accepts a theme payload via setTheme() that is retained and replayed\nafter every ready handshake.",
28681
29007
  "tagNameWithoutPrefix": "preview-frame",
28682
29008
  "tagName": "zn-preview-frame",
28683
29009
  "customElement": true,
28684
- "jsDoc": "/**\n * @summary Embeds a live preview iframe and drives the hp-preview postMessage\n * protocol: answers the frame's ready handshake with a config payload fetched\n * from data-uri, auto-saves watched forms on change, and refreshes the\n * preview after each save.\n * @documentation https://zinc.style/components/preview-frame\n * @status experimental\n * @since 1.0\n *\n * @event zn-error - Emitted when the preview reports a render error or a save fails.\n *\n * @csspart base - The component's base wrapper.\n * @csspart iframe - The preview iframe.\n * @csspart error - The error overlay.\n */",
29010
+ "jsDoc": "/**\n * @summary Embeds a live preview iframe and drives the hp-preview postMessage\n * protocol: answers the frame's ready handshake with a config payload fetched\n * from data-uri, auto-saves watched forms on change, refreshes the preview\n * after each save (its own, or a shell-driven save of a `refresh-on` form),\n * and accepts a theme payload via setTheme() that is retained and replayed\n * after every ready handshake.\n * @documentation https://zinc.style/components/preview-frame\n * @status experimental\n * @since 1.0\n *\n * @event zn-error - Emitted when the preview reports a render error or a save fails.\n *\n * @csspart base - The component's base wrapper.\n * @csspart stage - The device-width wrapper around the iframe.\n * @csspart iframe - The preview iframe.\n * @csspart error - The error overlay.\n *\n * @cssproperty --zn-preview-frame-dot-spacing - Spacing of the backdrop dot grid (`backdrop=\"dots\"`). Defaults to 20px.\n * @cssproperty --zn-preview-frame-dot-opacity - Opacity of the backdrop dots (`backdrop=\"dots\"`). Defaults to 0.08.\n */",
28685
29011
  "documentation": "https://zinc.style/components/preview-frame",
28686
29012
  "status": "experimental",
28687
29013
  "since": "1.0"
@@ -39787,6 +40113,1117 @@
39787
40113
  }
39788
40114
  ]
39789
40115
  },
40116
+ {
40117
+ "kind": "javascript-module",
40118
+ "path": "components/theme-editor/theme-editor.js",
40119
+ "declarations": [
40120
+ {
40121
+ "kind": "class",
40122
+ "description": "",
40123
+ "name": "ZnThemeEditor",
40124
+ "cssProperties": [
40125
+ {
40126
+ "description": "Width of the controls column.",
40127
+ "name": "--zn-theme-editor-controls-width"
40128
+ }
40129
+ ],
40130
+ "cssParts": [
40131
+ {
40132
+ "description": "The component's base wrapper.",
40133
+ "name": "base"
40134
+ },
40135
+ {
40136
+ "description": "The left-hand controls column, full height.",
40137
+ "name": "controls"
40138
+ },
40139
+ {
40140
+ "description": "The controls column's header row: `controls-caption` on the left, the light/dark mode toggle on the right.",
40141
+ "name": "controls-header"
40142
+ },
40143
+ {
40144
+ "description": "The preview column's header row: `preview-caption` on the left, the device switcher (and sources/submit) on the right. Spans the preview column only.",
40145
+ "name": "toolbar"
40146
+ },
40147
+ {
40148
+ "description": "A rendered section's or group's collapsible (`section-layout=\"collapsible\"`, or any nested group).",
40149
+ "name": "section"
40150
+ },
40151
+ {
40152
+ "description": "The footer wrapper beneath the controls.",
40153
+ "name": "footer"
40154
+ },
40155
+ {
40156
+ "description": "The preview column.",
40157
+ "name": "preview"
40158
+ },
40159
+ {
40160
+ "description": "The inline error strip.",
40161
+ "name": "error"
40162
+ },
40163
+ {
40164
+ "description": "The frame's base wrapper (forwarded from zn-preview-frame).",
40165
+ "name": "preview__base"
40166
+ },
40167
+ {
40168
+ "description": "The frame's device-width wrapper (forwarded from zn-preview-frame).",
40169
+ "name": "preview__stage"
40170
+ },
40171
+ {
40172
+ "description": "The frame's iframe (forwarded from zn-preview-frame).",
40173
+ "name": "preview__iframe"
40174
+ },
40175
+ {
40176
+ "description": "The frame's own error overlay (forwarded from zn-preview-frame).",
40177
+ "name": "preview__error"
40178
+ }
40179
+ ],
40180
+ "slots": [
40181
+ {
40182
+ "description": "Ungrouped theme controls, rendered above any sections. Controls assigned `slot=\"<name>\"` matching a `sections` entry (or, when nested, a `groups` entry) render inside that section/group instead. Harvesting and change detection walk every slot's full assigned subtree, not just direct children. With `sections` left unset, the structure is instead derived from the controls' own attributes: `group=\"<label>\"` becomes a tab and `category=\"<label>\"` a collapsible within it, and the control is slotted into that collapsible automatically. Either attribute works alone - a control with only `group` sits directly in its tab, and one with only `category` becomes its own top-level section. Setting `sections` explicitly disables the derivation entirely.",
40183
+ "name": ""
40184
+ },
40185
+ {
40186
+ "description": "Actions in the toolbar, right-aligned beside the device controls. Where a save button belongs.",
40187
+ "name": "toolbar"
40188
+ },
40189
+ {
40190
+ "description": "Actions pinned beneath the controls. The built-in submit button lives in the toolbar, not here.",
40191
+ "name": "footer"
40192
+ }
40193
+ ],
40194
+ "members": [
40195
+ {
40196
+ "kind": "field",
40197
+ "name": "dependencies",
40198
+ "type": {
40199
+ "text": "object"
40200
+ },
40201
+ "static": true,
40202
+ "default": "{ 'zn-collapsible': ZnCollapsible, 'zn-preview-frame': ZnPreviewFrame, 'zn-icon': ZnIcon, 'zn-button': ZnButton, 'zn-tabs': ZnTabs, 'zn-navbar': ZnNavbar, 'zn-select': ZnSelect, 'zn-option': ZnOption, }"
40203
+ },
40204
+ {
40205
+ "kind": "field",
40206
+ "name": "src",
40207
+ "type": {
40208
+ "text": "string"
40209
+ },
40210
+ "default": "''",
40211
+ "description": "URL of the preview shell page; forwarded to the frame.",
40212
+ "attribute": "src"
40213
+ },
40214
+ {
40215
+ "kind": "field",
40216
+ "name": "frameOrigin",
40217
+ "type": {
40218
+ "text": "string"
40219
+ },
40220
+ "default": "''",
40221
+ "description": "Expected origin of the iframe; forwarded to the frame.",
40222
+ "attribute": "frame-origin"
40223
+ },
40224
+ {
40225
+ "kind": "field",
40226
+ "name": "dataUri",
40227
+ "type": {
40228
+ "text": "string"
40229
+ },
40230
+ "default": "''",
40231
+ "description": "Optional endpoint returning the base hp-preview:config payload.",
40232
+ "attribute": "data-uri"
40233
+ },
40234
+ {
40235
+ "kind": "field",
40236
+ "name": "mode",
40237
+ "type": {
40238
+ "text": "ThemeEditorMode"
40239
+ },
40240
+ "default": "'light'",
40241
+ "description": "Which mode the preview renders in. Travels in the theme payload.",
40242
+ "attribute": "mode",
40243
+ "reflects": true
40244
+ },
40245
+ {
40246
+ "kind": "field",
40247
+ "name": "device",
40248
+ "type": {
40249
+ "text": "ThemeEditorDevice"
40250
+ },
40251
+ "default": "'desktop'",
40252
+ "description": "Preview viewport width. Resizes the frame only; not part of the payload.",
40253
+ "attribute": "device",
40254
+ "reflects": true
40255
+ },
40256
+ {
40257
+ "kind": "field",
40258
+ "name": "minHeight",
40259
+ "type": {
40260
+ "text": "number"
40261
+ },
40262
+ "default": "480",
40263
+ "description": "Minimum height of the preview row, in pixels; forwarded to the frame as its own floor.",
40264
+ "attribute": "min-height"
40265
+ },
40266
+ {
40267
+ "kind": "field",
40268
+ "name": "debounce",
40269
+ "type": {
40270
+ "text": "number"
40271
+ },
40272
+ "default": "150",
40273
+ "description": "Debounce in ms between a control change and the push to the preview.",
40274
+ "attribute": "debounce"
40275
+ },
40276
+ {
40277
+ "kind": "field",
40278
+ "name": "action",
40279
+ "type": {
40280
+ "text": "string"
40281
+ },
40282
+ "default": "''",
40283
+ "description": "Optional endpoint the values are POSTed to. Empty = no persistence.",
40284
+ "attribute": "action"
40285
+ },
40286
+ {
40287
+ "kind": "field",
40288
+ "name": "saveDebounce",
40289
+ "type": {
40290
+ "text": "number"
40291
+ },
40292
+ "default": "1000",
40293
+ "description": "Debounce in ms between a control change and the save POST.",
40294
+ "attribute": "save-debounce"
40295
+ },
40296
+ {
40297
+ "kind": "field",
40298
+ "name": "sections",
40299
+ "type": {
40300
+ "text": "ThemeEditorSection[]"
40301
+ },
40302
+ "default": "[]",
40303
+ "description": "Groups controls into named sections. Empty/unset falls back to deriving the\nstructure from the controls' own `group`/`category` attributes, and renders\none ungrouped column when they carry neither. A section with a non-empty\n`groups` nests a collapsible per group inside a `zn-tabs` tab for that\nsection - see `groups` on `ThemeEditorSection`.",
40304
+ "attribute": "sections"
40305
+ },
40306
+ {
40307
+ "kind": "field",
40308
+ "name": "sectionLayout",
40309
+ "type": {
40310
+ "text": "'collapsible' | 'tabs'"
40311
+ },
40312
+ "default": "'collapsible'",
40313
+ "description": "Presentation for flat, group-less `sections`: stacked `zn-collapsible`s\n(default) or a `zn-tabs` strip. Ignored once any section has `groups` -\nnested sections always render as tabs.",
40314
+ "attribute": "section-layout"
40315
+ },
40316
+ {
40317
+ "kind": "field",
40318
+ "name": "sources",
40319
+ "type": {
40320
+ "text": "ThemeEditorSource[]"
40321
+ },
40322
+ "default": "[]",
40323
+ "description": "Dropdown of preview sources, `{label, src}`, rendered in the toolbar. Empty/unset renders no dropdown; the first entry wins over an explicit `src` when non-empty.",
40324
+ "attribute": "sources"
40325
+ },
40326
+ {
40327
+ "kind": "field",
40328
+ "name": "controlsCollapsed",
40329
+ "type": {
40330
+ "text": "boolean"
40331
+ },
40332
+ "default": "false",
40333
+ "description": "Collapses the controls column.",
40334
+ "attribute": "controls-collapsed",
40335
+ "reflects": true
40336
+ },
40337
+ {
40338
+ "kind": "field",
40339
+ "name": "standalone",
40340
+ "type": {
40341
+ "text": "boolean"
40342
+ },
40343
+ "default": "false",
40344
+ "description": "Presents the editor as its own bordered, rounded panel with a plain preview backdrop, rather than embedded in a dotted canvas.",
40345
+ "attribute": "standalone",
40346
+ "reflects": true
40347
+ },
40348
+ {
40349
+ "kind": "field",
40350
+ "name": "controlsCaption",
40351
+ "type": {
40352
+ "text": "string"
40353
+ },
40354
+ "default": "''",
40355
+ "description": "Caption in the controls column's header row. Empty (default) renders no text; the row itself always renders.",
40356
+ "attribute": "controls-caption"
40357
+ },
40358
+ {
40359
+ "kind": "field",
40360
+ "name": "previewCaption",
40361
+ "type": {
40362
+ "text": "string"
40363
+ },
40364
+ "default": "''",
40365
+ "description": "Caption at the left of the toolbar, opposite the device and mode controls. Empty (default) renders no text.",
40366
+ "attribute": "preview-caption"
40367
+ },
40368
+ {
40369
+ "kind": "field",
40370
+ "name": "submitLabel",
40371
+ "type": {
40372
+ "text": "string"
40373
+ },
40374
+ "default": "''",
40375
+ "description": "Label for the built-in submit button. Empty (default) renders no button.",
40376
+ "attribute": "submit-label"
40377
+ },
40378
+ {
40379
+ "kind": "field",
40380
+ "name": "manual",
40381
+ "type": {
40382
+ "text": "boolean"
40383
+ },
40384
+ "default": "false",
40385
+ "description": "Disables the debounced auto-save; saving then happens only via submit. Preview pushes are unaffected.",
40386
+ "attribute": "manual"
40387
+ },
40388
+ {
40389
+ "kind": "field",
40390
+ "name": "frame",
40391
+ "type": {
40392
+ "text": "ZnPreviewFrame"
40393
+ }
40394
+ },
40395
+ {
40396
+ "kind": "field",
40397
+ "name": "controlsSlot",
40398
+ "type": {
40399
+ "text": "HTMLSlotElement"
40400
+ },
40401
+ "privacy": "private"
40402
+ },
40403
+ {
40404
+ "kind": "field",
40405
+ "name": "sectionSlots",
40406
+ "type": {
40407
+ "text": "NodeListOf<HTMLSlotElement>"
40408
+ },
40409
+ "privacy": "private"
40410
+ },
40411
+ {
40412
+ "kind": "field",
40413
+ "name": "error",
40414
+ "type": {
40415
+ "text": "string"
40416
+ },
40417
+ "privacy": "protected",
40418
+ "default": "''"
40419
+ },
40420
+ {
40421
+ "kind": "field",
40422
+ "name": "_submitting",
40423
+ "type": {
40424
+ "text": "boolean"
40425
+ },
40426
+ "privacy": "private",
40427
+ "default": "false"
40428
+ },
40429
+ {
40430
+ "kind": "field",
40431
+ "name": "_sourceIndex",
40432
+ "type": {
40433
+ "text": "number"
40434
+ },
40435
+ "privacy": "private",
40436
+ "default": "0"
40437
+ },
40438
+ {
40439
+ "kind": "field",
40440
+ "name": "hasSlotController",
40441
+ "privacy": "private",
40442
+ "readonly": true,
40443
+ "default": "new HasSlotController(this, 'footer', '[default]')"
40444
+ },
40445
+ {
40446
+ "kind": "field",
40447
+ "name": "_pushTimer",
40448
+ "type": {
40449
+ "text": "number | undefined"
40450
+ },
40451
+ "privacy": "private"
40452
+ },
40453
+ {
40454
+ "kind": "field",
40455
+ "name": "_saveTimer",
40456
+ "type": {
40457
+ "text": "number | undefined"
40458
+ },
40459
+ "privacy": "private"
40460
+ },
40461
+ {
40462
+ "kind": "field",
40463
+ "name": "_saving",
40464
+ "type": {
40465
+ "text": "boolean"
40466
+ },
40467
+ "privacy": "private",
40468
+ "default": "false"
40469
+ },
40470
+ {
40471
+ "kind": "field",
40472
+ "name": "_saveQueued",
40473
+ "type": {
40474
+ "text": "boolean"
40475
+ },
40476
+ "privacy": "private",
40477
+ "default": "false"
40478
+ },
40479
+ {
40480
+ "kind": "field",
40481
+ "name": "_saveWaiters",
40482
+ "type": {
40483
+ "text": "((ok: boolean) => void)[]"
40484
+ },
40485
+ "privacy": "private",
40486
+ "default": "[]"
40487
+ },
40488
+ {
40489
+ "kind": "field",
40490
+ "name": "_narrowQuery",
40491
+ "privacy": "private",
40492
+ "readonly": true
40493
+ },
40494
+ {
40495
+ "kind": "field",
40496
+ "name": "_wasNarrow",
40497
+ "type": {
40498
+ "text": "boolean"
40499
+ },
40500
+ "privacy": "private",
40501
+ "default": "false"
40502
+ },
40503
+ {
40504
+ "kind": "field",
40505
+ "name": "_mounted",
40506
+ "type": {
40507
+ "text": "boolean"
40508
+ },
40509
+ "privacy": "private",
40510
+ "default": "false"
40511
+ },
40512
+ {
40513
+ "kind": "field",
40514
+ "name": "_lastControls",
40515
+ "type": {
40516
+ "text": "HarvestableControl[]"
40517
+ },
40518
+ "privacy": "private",
40519
+ "default": "[]"
40520
+ },
40521
+ {
40522
+ "kind": "field",
40523
+ "name": "_controlsObserverConfig",
40524
+ "type": {
40525
+ "text": "MutationObserverInit"
40526
+ },
40527
+ "privacy": "private",
40528
+ "readonly": true,
40529
+ "default": "{ childList: true, subtree: true }"
40530
+ },
40531
+ {
40532
+ "kind": "field",
40533
+ "name": "_controlsObserver",
40534
+ "privacy": "private",
40535
+ "readonly": true,
40536
+ "default": "new MutationController(this, { target: null, config: this._controlsObserverConfig, callback: () => this._pushIfControlsChanged(), })"
40537
+ },
40538
+ {
40539
+ "kind": "field",
40540
+ "name": "_modeValues",
40541
+ "type": {
40542
+ "text": "Record<ThemeEditorMode, Record<string, unknown>>"
40543
+ },
40544
+ "privacy": "private",
40545
+ "default": "{ light: {}, dark: {} }"
40546
+ },
40547
+ {
40548
+ "kind": "field",
40549
+ "name": "_suppressDepth",
40550
+ "type": {
40551
+ "text": "number"
40552
+ },
40553
+ "privacy": "private",
40554
+ "default": "0"
40555
+ },
40556
+ {
40557
+ "kind": "field",
40558
+ "name": "_openedInitialCollapsible",
40559
+ "type": {
40560
+ "text": "boolean"
40561
+ },
40562
+ "privacy": "private",
40563
+ "default": "false"
40564
+ },
40565
+ {
40566
+ "kind": "field",
40567
+ "name": "values",
40568
+ "type": {
40569
+ "text": "{ light: Record<string, unknown>; dark: Record<string, unknown> }"
40570
+ },
40571
+ "description": "The current per-mode value sets. Returns copies.",
40572
+ "readonly": true
40573
+ },
40574
+ {
40575
+ "kind": "field",
40576
+ "name": "activeValues",
40577
+ "type": {
40578
+ "text": "Record<string, unknown>"
40579
+ },
40580
+ "description": "The active mode's values - what gets pushed to the preview frame.",
40581
+ "readonly": true
40582
+ },
40583
+ {
40584
+ "kind": "method",
40585
+ "name": "_controlSlots",
40586
+ "privacy": "private",
40587
+ "return": {
40588
+ "type": {
40589
+ "text": "HTMLSlotElement[]"
40590
+ }
40591
+ },
40592
+ "description": "The default slot plus every rendered section slot."
40593
+ },
40594
+ {
40595
+ "kind": "method",
40596
+ "name": "_harvestNamed",
40597
+ "privacy": "private",
40598
+ "return": {
40599
+ "type": {
40600
+ "text": "{ name: string; control: HarvestableControl }[]"
40601
+ }
40602
+ },
40603
+ "description": "Walks every control slot (default and sections) for every enabled, named control."
40604
+ },
40605
+ {
40606
+ "kind": "method",
40607
+ "name": "_hasAssignedControls",
40608
+ "privacy": "private",
40609
+ "return": {
40610
+ "type": {
40611
+ "text": "boolean"
40612
+ }
40613
+ },
40614
+ "parameters": [
40615
+ {
40616
+ "name": "slotName",
40617
+ "type": {
40618
+ "text": "string"
40619
+ }
40620
+ }
40621
+ ],
40622
+ "description": "Whether a direct child is assigned to the named slot — an empty section renders no chrome."
40623
+ },
40624
+ {
40625
+ "kind": "method",
40626
+ "name": "_isBooleanControl",
40627
+ "privacy": "private",
40628
+ "return": {
40629
+ "type": {
40630
+ "text": "boolean"
40631
+ }
40632
+ },
40633
+ "parameters": [
40634
+ {
40635
+ "name": "control",
40636
+ "type": {
40637
+ "text": "HarvestableControl"
40638
+ }
40639
+ }
40640
+ ]
40641
+ },
40642
+ {
40643
+ "kind": "method",
40644
+ "name": "_readControlValue",
40645
+ "privacy": "private",
40646
+ "return": {
40647
+ "type": {
40648
+ "text": "unknown"
40649
+ }
40650
+ },
40651
+ "parameters": [
40652
+ {
40653
+ "name": "control",
40654
+ "type": {
40655
+ "text": "HarvestableControl"
40656
+ }
40657
+ }
40658
+ ]
40659
+ },
40660
+ {
40661
+ "kind": "method",
40662
+ "name": "_seed",
40663
+ "privacy": "private",
40664
+ "description": "Seeds light/dark entries for any control name not already present."
40665
+ },
40666
+ {
40667
+ "kind": "method",
40668
+ "name": "_writeBack",
40669
+ "privacy": "private",
40670
+ "parameters": [
40671
+ {
40672
+ "name": "mode",
40673
+ "default": "this.mode",
40674
+ "type": {
40675
+ "text": "ThemeEditorMode"
40676
+ }
40677
+ }
40678
+ ],
40679
+ "description": "Writes a mode's value set back into the controls so they display it."
40680
+ },
40681
+ {
40682
+ "kind": "method",
40683
+ "name": "_harvestInto",
40684
+ "privacy": "private",
40685
+ "parameters": [
40686
+ {
40687
+ "name": "mode",
40688
+ "type": {
40689
+ "text": "ThemeEditorMode"
40690
+ }
40691
+ }
40692
+ ],
40693
+ "description": "Harvests the controls' current displayed values into a mode's set."
40694
+ },
40695
+ {
40696
+ "kind": "field",
40697
+ "name": "_onNarrowChange",
40698
+ "privacy": "private",
40699
+ "readonly": true
40700
+ },
40701
+ {
40702
+ "kind": "method",
40703
+ "name": "_push",
40704
+ "privacy": "private",
40705
+ "description": "Pushes the active mode's values into the preview and announces it."
40706
+ },
40707
+ {
40708
+ "kind": "method",
40709
+ "name": "_queueSave",
40710
+ "privacy": "private"
40711
+ },
40712
+ {
40713
+ "kind": "method",
40714
+ "name": "_save",
40715
+ "privacy": "private"
40716
+ },
40717
+ {
40718
+ "kind": "method",
40719
+ "name": "_awaitSave",
40720
+ "privacy": "private",
40721
+ "return": {
40722
+ "type": {
40723
+ "text": "Promise<boolean>"
40724
+ }
40725
+ },
40726
+ "description": "Resolves once a save actually carrying the current values has settled."
40727
+ },
40728
+ {
40729
+ "kind": "method",
40730
+ "name": "_pushIfControlsChanged",
40731
+ "privacy": "private",
40732
+ "description": "Pushes only if the deep set of named controls (the same set harvesting\nwalks, so it includes controls nested inside sections) has changed since\nthe last push. Comparison is by element identity only, never by value."
40733
+ },
40734
+ {
40735
+ "kind": "method",
40736
+ "name": "_flushPendingEdit",
40737
+ "privacy": "private",
40738
+ "description": "Harvests and queues a save for a pending debounced edit, then cancels its timer."
40739
+ },
40740
+ {
40741
+ "kind": "field",
40742
+ "name": "_onSubmit",
40743
+ "privacy": "private",
40744
+ "readonly": true
40745
+ },
40746
+ {
40747
+ "kind": "method",
40748
+ "name": "_announce",
40749
+ "privacy": "private"
40750
+ },
40751
+ {
40752
+ "kind": "method",
40753
+ "name": "_fail",
40754
+ "privacy": "private",
40755
+ "parameters": [
40756
+ {
40757
+ "name": "message",
40758
+ "type": {
40759
+ "text": "string"
40760
+ }
40761
+ }
40762
+ ]
40763
+ },
40764
+ {
40765
+ "kind": "field",
40766
+ "name": "_onControlChange",
40767
+ "privacy": "private",
40768
+ "readonly": true
40769
+ },
40770
+ {
40771
+ "kind": "field",
40772
+ "name": "_onSlotChange",
40773
+ "privacy": "private",
40774
+ "readonly": true
40775
+ },
40776
+ {
40777
+ "kind": "field",
40778
+ "name": "_setDevice",
40779
+ "privacy": "private",
40780
+ "readonly": true
40781
+ },
40782
+ {
40783
+ "kind": "field",
40784
+ "name": "_toggleMode",
40785
+ "privacy": "private",
40786
+ "readonly": true
40787
+ },
40788
+ {
40789
+ "kind": "field",
40790
+ "name": "_onFrameError",
40791
+ "privacy": "private",
40792
+ "readonly": true
40793
+ },
40794
+ {
40795
+ "kind": "method",
40796
+ "name": "_sourcesSafe",
40797
+ "privacy": "private",
40798
+ "return": {
40799
+ "type": {
40800
+ "text": "ThemeEditorSource[]"
40801
+ }
40802
+ }
40803
+ },
40804
+ {
40805
+ "kind": "method",
40806
+ "name": "_frameSrc",
40807
+ "privacy": "private",
40808
+ "return": {
40809
+ "type": {
40810
+ "text": "string"
40811
+ }
40812
+ }
40813
+ },
40814
+ {
40815
+ "kind": "field",
40816
+ "name": "_onSourceChange",
40817
+ "privacy": "private",
40818
+ "readonly": true
40819
+ },
40820
+ {
40821
+ "kind": "method",
40822
+ "name": "_sectionsSafe",
40823
+ "privacy": "private",
40824
+ "return": {
40825
+ "type": {
40826
+ "text": "ThemeEditorSection[]"
40827
+ }
40828
+ }
40829
+ },
40830
+ {
40831
+ "kind": "method",
40832
+ "name": "_groupsFor",
40833
+ "privacy": "private",
40834
+ "return": {
40835
+ "type": {
40836
+ "text": "ThemeEditorGroup[]"
40837
+ }
40838
+ },
40839
+ "parameters": [
40840
+ {
40841
+ "name": "section",
40842
+ "type": {
40843
+ "text": "ThemeEditorSection"
40844
+ }
40845
+ }
40846
+ ]
40847
+ },
40848
+ {
40849
+ "kind": "method",
40850
+ "name": "_hasStructureAttributes",
40851
+ "privacy": "private",
40852
+ "return": {
40853
+ "type": {
40854
+ "text": "boolean"
40855
+ }
40856
+ },
40857
+ "description": "Whether any direct child carries the `group`/`category` structure attributes."
40858
+ },
40859
+ {
40860
+ "kind": "method",
40861
+ "name": "_usesDerivedSections",
40862
+ "privacy": "private",
40863
+ "return": {
40864
+ "type": {
40865
+ "text": "boolean"
40866
+ }
40867
+ },
40868
+ "description": "Attribute-derived structure applies only when `sections` is left unset."
40869
+ },
40870
+ {
40871
+ "kind": "method",
40872
+ "name": "_derive",
40873
+ "privacy": "private",
40874
+ "return": {
40875
+ "type": {
40876
+ "text": "DerivedStructure"
40877
+ }
40878
+ },
40879
+ "description": "Builds the tab/collapsible tree from the controls' own `group` (tab) and\n`category` (collapsible) attributes, alongside the slot name each control\nneeds assigning to. Only direct children are considered, since `slot` only\nworks one level deep. Slot names are slugged from the labels and made\nunique across the whole tree, so two tabs can each hold a \"Colors\"\ncategory without their slots colliding."
40880
+ },
40881
+ {
40882
+ "kind": "method",
40883
+ "name": "_effectiveSections",
40884
+ "privacy": "private",
40885
+ "return": {
40886
+ "type": {
40887
+ "text": "ThemeEditorSection[]"
40888
+ }
40889
+ },
40890
+ "description": "Explicit `sections` when set, otherwise the attribute-derived tree."
40891
+ },
40892
+ {
40893
+ "kind": "method",
40894
+ "name": "_assignDerivedSlots",
40895
+ "privacy": "private"
40896
+ },
40897
+ {
40898
+ "kind": "method",
40899
+ "name": "_hasNestedGroups",
40900
+ "privacy": "private",
40901
+ "return": {
40902
+ "type": {
40903
+ "text": "boolean"
40904
+ }
40905
+ },
40906
+ "description": "Whether any section has a populated `groups` - the switch to nested tabs+collapsibles."
40907
+ },
40908
+ {
40909
+ "kind": "method",
40910
+ "name": "_visibleGroups",
40911
+ "privacy": "private",
40912
+ "return": {
40913
+ "type": {
40914
+ "text": "ThemeEditorGroup[]"
40915
+ }
40916
+ },
40917
+ "parameters": [
40918
+ {
40919
+ "name": "section",
40920
+ "type": {
40921
+ "text": "ThemeEditorSection"
40922
+ }
40923
+ }
40924
+ ]
40925
+ },
40926
+ {
40927
+ "kind": "method",
40928
+ "name": "_visibleSections",
40929
+ "privacy": "private",
40930
+ "return": {
40931
+ "type": {
40932
+ "text": "ThemeEditorSection[]"
40933
+ }
40934
+ },
40935
+ "description": "Configured sections that have an assigned control, or (nested) a populated group - shared by every presentation."
40936
+ },
40937
+ {
40938
+ "kind": "method",
40939
+ "name": "_renderSections",
40940
+ "privacy": "private"
40941
+ },
40942
+ {
40943
+ "kind": "method",
40944
+ "name": "_renderGroups",
40945
+ "privacy": "private",
40946
+ "parameters": [
40947
+ {
40948
+ "name": "section",
40949
+ "type": {
40950
+ "text": "ThemeEditorSection"
40951
+ }
40952
+ }
40953
+ ]
40954
+ },
40955
+ {
40956
+ "kind": "method",
40957
+ "name": "_tabCollapsibles",
40958
+ "privacy": "private",
40959
+ "return": {
40960
+ "type": {
40961
+ "text": "ZnCollapsible[]"
40962
+ }
40963
+ },
40964
+ "parameters": [
40965
+ {
40966
+ "name": "section",
40967
+ "type": {
40968
+ "text": "ThemeEditorSection"
40969
+ }
40970
+ }
40971
+ ],
40972
+ "description": "Every collapsible inside a tab's panel, in document order."
40973
+ },
40974
+ {
40975
+ "kind": "method",
40976
+ "name": "_expandFirst",
40977
+ "privacy": "private",
40978
+ "parameters": [
40979
+ {
40980
+ "name": "collapsibles",
40981
+ "type": {
40982
+ "text": "ZnCollapsible[]"
40983
+ }
40984
+ }
40985
+ ],
40986
+ "description": "Expands the first collapsible, unless one is already open."
40987
+ },
40988
+ {
40989
+ "kind": "method",
40990
+ "name": "_openFirstCollapsible",
40991
+ "privacy": "private",
40992
+ "parameters": [
40993
+ {
40994
+ "name": "section",
40995
+ "type": {
40996
+ "text": "ThemeEditorSection"
40997
+ }
40998
+ }
40999
+ ]
41000
+ },
41001
+ {
41002
+ "kind": "method",
41003
+ "name": "_renderTabs",
41004
+ "privacy": "private",
41005
+ "parameters": [
41006
+ {
41007
+ "name": "panel",
41008
+ "type": {
41009
+ "text": "(section: ThemeEditorSection) => unknown"
41010
+ }
41011
+ }
41012
+ ]
41013
+ }
41014
+ ],
41015
+ "events": [
41016
+ {
41017
+ "description": "Emitted when the values, mode or device change.",
41018
+ "name": "zn-theme-change"
41019
+ },
41020
+ {
41021
+ "description": "Emitted on submit (button click), carrying the current values. With `action` set, only fires after a successful save.",
41022
+ "name": "zn-theme-submit"
41023
+ },
41024
+ {
41025
+ "description": "Emitted when a save fails. Also seen for preview render failures: the frame's zn-error is composed and not stopped, so it bubbles out through the editor too.",
41026
+ "name": "zn-error"
41027
+ }
41028
+ ],
41029
+ "attributes": [
41030
+ {
41031
+ "name": "src",
41032
+ "type": {
41033
+ "text": "string"
41034
+ },
41035
+ "default": "''",
41036
+ "description": "URL of the preview shell page; forwarded to the frame.",
41037
+ "fieldName": "src"
41038
+ },
41039
+ {
41040
+ "name": "frame-origin",
41041
+ "type": {
41042
+ "text": "string"
41043
+ },
41044
+ "default": "''",
41045
+ "description": "Expected origin of the iframe; forwarded to the frame.",
41046
+ "fieldName": "frameOrigin"
41047
+ },
41048
+ {
41049
+ "name": "data-uri",
41050
+ "type": {
41051
+ "text": "string"
41052
+ },
41053
+ "default": "''",
41054
+ "description": "Optional endpoint returning the base hp-preview:config payload.",
41055
+ "fieldName": "dataUri"
41056
+ },
41057
+ {
41058
+ "name": "mode",
41059
+ "type": {
41060
+ "text": "ThemeEditorMode"
41061
+ },
41062
+ "default": "'light'",
41063
+ "description": "Which mode the preview renders in. Travels in the theme payload.",
41064
+ "fieldName": "mode"
41065
+ },
41066
+ {
41067
+ "name": "device",
41068
+ "type": {
41069
+ "text": "ThemeEditorDevice"
41070
+ },
41071
+ "default": "'desktop'",
41072
+ "description": "Preview viewport width. Resizes the frame only; not part of the payload.",
41073
+ "fieldName": "device"
41074
+ },
41075
+ {
41076
+ "name": "min-height",
41077
+ "type": {
41078
+ "text": "number"
41079
+ },
41080
+ "default": "480",
41081
+ "description": "Minimum height of the preview row, in pixels; forwarded to the frame as its own floor.",
41082
+ "fieldName": "minHeight"
41083
+ },
41084
+ {
41085
+ "name": "debounce",
41086
+ "type": {
41087
+ "text": "number"
41088
+ },
41089
+ "default": "150",
41090
+ "description": "Debounce in ms between a control change and the push to the preview.",
41091
+ "fieldName": "debounce"
41092
+ },
41093
+ {
41094
+ "name": "action",
41095
+ "type": {
41096
+ "text": "string"
41097
+ },
41098
+ "default": "''",
41099
+ "description": "Optional endpoint the values are POSTed to. Empty = no persistence.",
41100
+ "fieldName": "action"
41101
+ },
41102
+ {
41103
+ "name": "save-debounce",
41104
+ "type": {
41105
+ "text": "number"
41106
+ },
41107
+ "default": "1000",
41108
+ "description": "Debounce in ms between a control change and the save POST.",
41109
+ "fieldName": "saveDebounce"
41110
+ },
41111
+ {
41112
+ "name": "sections",
41113
+ "type": {
41114
+ "text": "ThemeEditorSection[]"
41115
+ },
41116
+ "default": "[]",
41117
+ "description": "Groups controls into named sections. Empty/unset falls back to deriving the\nstructure from the controls' own `group`/`category` attributes, and renders\none ungrouped column when they carry neither. A section with a non-empty\n`groups` nests a collapsible per group inside a `zn-tabs` tab for that\nsection - see `groups` on `ThemeEditorSection`.",
41118
+ "fieldName": "sections"
41119
+ },
41120
+ {
41121
+ "name": "section-layout",
41122
+ "type": {
41123
+ "text": "'collapsible' | 'tabs'"
41124
+ },
41125
+ "default": "'collapsible'",
41126
+ "description": "Presentation for flat, group-less `sections`: stacked `zn-collapsible`s\n(default) or a `zn-tabs` strip. Ignored once any section has `groups` -\nnested sections always render as tabs.",
41127
+ "fieldName": "sectionLayout"
41128
+ },
41129
+ {
41130
+ "name": "sources",
41131
+ "type": {
41132
+ "text": "ThemeEditorSource[]"
41133
+ },
41134
+ "default": "[]",
41135
+ "description": "Dropdown of preview sources, `{label, src}`, rendered in the toolbar. Empty/unset renders no dropdown; the first entry wins over an explicit `src` when non-empty.",
41136
+ "fieldName": "sources"
41137
+ },
41138
+ {
41139
+ "name": "controls-collapsed",
41140
+ "type": {
41141
+ "text": "boolean"
41142
+ },
41143
+ "default": "false",
41144
+ "description": "Collapses the controls column.",
41145
+ "fieldName": "controlsCollapsed"
41146
+ },
41147
+ {
41148
+ "name": "standalone",
41149
+ "type": {
41150
+ "text": "boolean"
41151
+ },
41152
+ "default": "false",
41153
+ "description": "Presents the editor as its own bordered, rounded panel with a plain preview backdrop, rather than embedded in a dotted canvas.",
41154
+ "fieldName": "standalone"
41155
+ },
41156
+ {
41157
+ "name": "controls-caption",
41158
+ "type": {
41159
+ "text": "string"
41160
+ },
41161
+ "default": "''",
41162
+ "description": "Caption in the controls column's header row. Empty (default) renders no text; the row itself always renders.",
41163
+ "fieldName": "controlsCaption"
41164
+ },
41165
+ {
41166
+ "name": "preview-caption",
41167
+ "type": {
41168
+ "text": "string"
41169
+ },
41170
+ "default": "''",
41171
+ "description": "Caption at the left of the toolbar, opposite the device and mode controls. Empty (default) renders no text.",
41172
+ "fieldName": "previewCaption"
41173
+ },
41174
+ {
41175
+ "name": "submit-label",
41176
+ "type": {
41177
+ "text": "string"
41178
+ },
41179
+ "default": "''",
41180
+ "description": "Label for the built-in submit button. Empty (default) renders no button.",
41181
+ "fieldName": "submitLabel"
41182
+ },
41183
+ {
41184
+ "name": "manual",
41185
+ "type": {
41186
+ "text": "boolean"
41187
+ },
41188
+ "default": "false",
41189
+ "description": "Disables the debounced auto-save; saving then happens only via submit. Preview pushes are unaffected.",
41190
+ "fieldName": "manual"
41191
+ }
41192
+ ],
41193
+ "superclass": {
41194
+ "name": "ZincElement",
41195
+ "module": "/src/internal/zinc-element"
41196
+ },
41197
+ "summary": "A theme editor: slotted form controls drive a live preview frame,\nwith a toolbar for the preview's light/dark mode and device width.",
41198
+ "tagNameWithoutPrefix": "theme-editor",
41199
+ "tagName": "zn-theme-editor",
41200
+ "customElement": true,
41201
+ "jsDoc": "/**\n * @summary A theme editor: slotted form controls drive a live preview frame,\n * with a toolbar for the preview's light/dark mode and device width.\n * @documentation https://zinc.style/components/theme-editor\n * @status experimental\n * @since 1.0\n *\n * @dependency zn-collapsible\n * @dependency zn-preview-frame\n * @dependency zn-icon\n * @dependency zn-button\n * @dependency zn-tabs\n * @dependency zn-navbar\n * @dependency zn-select\n *\n * @event zn-theme-change - Emitted when the values, mode or device change.\n * @event zn-theme-submit - Emitted on submit (button click), carrying the\n * current values. With `action` set, only fires after a successful save.\n * @event zn-error - Emitted when a save fails. Also seen for preview render\n * failures: the frame's zn-error is composed and not stopped, so it bubbles\n * out through the editor too.\n *\n * @slot - Ungrouped theme controls, rendered above any sections. Controls\n * assigned `slot=\"<name>\"` matching a `sections` entry (or, when nested, a\n * `groups` entry) render inside that section/group instead. Harvesting and\n * change detection walk every slot's full assigned subtree, not just direct\n * children.\n *\n * With `sections` left unset, the structure is instead derived from the\n * controls' own attributes: `group=\"<label>\"` becomes a tab and\n * `category=\"<label>\"` a collapsible within it, and the control is slotted\n * into that collapsible automatically. Either attribute works alone - a\n * control with only `group` sits directly in its tab, and one with only\n * `category` becomes its own top-level section. Setting `sections`\n * explicitly disables the derivation entirely.\n * @slot toolbar - Actions in the toolbar, right-aligned beside the device\n * controls. Where a save button belongs.\n * @slot footer - Actions pinned beneath the controls. The built-in submit button\n * lives in the toolbar, not here.\n *\n * @csspart base - The component's base wrapper.\n * @csspart controls - The left-hand controls column, full height.\n * @csspart controls-header - The controls column's header row: `controls-caption` on the left, the light/dark mode toggle on the right.\n * @csspart toolbar - The preview column's header row: `preview-caption` on the left, the device switcher (and sources/submit) on the right. Spans the preview column only.\n * @csspart section - A rendered section's or group's collapsible (`section-layout=\"collapsible\"`, or any nested group).\n * @csspart footer - The footer wrapper beneath the controls.\n * @csspart preview - The preview column.\n * @csspart error - The inline error strip.\n * @csspart preview__base - The frame's base wrapper (forwarded from zn-preview-frame).\n * @csspart preview__stage - The frame's device-width wrapper (forwarded from zn-preview-frame).\n * @csspart preview__iframe - The frame's iframe (forwarded from zn-preview-frame).\n * @csspart preview__error - The frame's own error overlay (forwarded from zn-preview-frame).\n *\n * @cssproperty --zn-theme-editor-controls-width - Width of the controls column.\n */",
41202
+ "documentation": "https://zinc.style/components/theme-editor",
41203
+ "status": "experimental",
41204
+ "since": "1.0",
41205
+ "dependencies": [
41206
+ "zn-collapsible",
41207
+ "zn-preview-frame",
41208
+ "zn-icon",
41209
+ "zn-button",
41210
+ "zn-tabs",
41211
+ "zn-navbar",
41212
+ "zn-select"
41213
+ ]
41214
+ }
41215
+ ],
41216
+ "exports": [
41217
+ {
41218
+ "kind": "js",
41219
+ "name": "default",
41220
+ "declaration": {
41221
+ "name": "ZnThemeEditor",
41222
+ "module": "components/theme-editor/theme-editor.js"
41223
+ }
41224
+ }
41225
+ ]
41226
+ },
39790
41227
  {
39791
41228
  "kind": "javascript-module",
39792
41229
  "path": "components/tile/tile.js",
@@ -42440,7 +43877,7 @@
42440
43877
  "package": {
42441
43878
  "name": "@kubex/zinc",
42442
43879
  "description": "A collection of web components for building web applications based off of @shoelace-style/Shoelace",
42443
- "version": "1.1.68",
43880
+ "version": "1.1.70",
42444
43881
  "author": "",
42445
43882
  "license": "MIT"
42446
43883
  }