@greypan/web-ui 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/README.CN.md +297 -34
  2. package/README.md +304 -39
  3. package/dist/_virtual/{_@oxc-project_runtime@0.140.0 → _@oxc-project_runtime@0.146.0}/helpers/esm/decorate.js +1 -1
  4. package/dist/assets/glass.js +1 -1
  5. package/dist/assets/glass.js.map +1 -1
  6. package/dist/assets/menu-portal.js +1 -1
  7. package/dist/assets/menu-portal.js.map +1 -1
  8. package/dist/assets/overlay-motion.js +1 -1
  9. package/dist/assets/overlay-motion.js.map +1 -1
  10. package/dist/assets/toast-containers.js +1 -1
  11. package/dist/assets/toast-containers.js.map +1 -1
  12. package/dist/components/autocomplete/index.d.ts +4 -12
  13. package/dist/components/autocomplete/index.js +95 -102
  14. package/dist/components/autocomplete/index.js.map +1 -1
  15. package/dist/components/autocomplete/style.js +1 -1
  16. package/dist/components/autocomplete/style.js.map +1 -1
  17. package/dist/components/avatar/index.d.ts +0 -1
  18. package/dist/components/avatar/index.js +8 -13
  19. package/dist/components/avatar/index.js.map +1 -1
  20. package/dist/components/back-top/index.js +1 -1
  21. package/dist/components/back-top/style.js +1 -1
  22. package/dist/components/back-top/style.js.map +1 -1
  23. package/dist/components/badge/index.d.ts +1 -0
  24. package/dist/components/badge/index.js +12 -14
  25. package/dist/components/badge/index.js.map +1 -1
  26. package/dist/components/button/index.d.ts +2 -0
  27. package/dist/components/button/index.js +51 -38
  28. package/dist/components/button/index.js.map +1 -1
  29. package/dist/components/button/style.js +1 -1
  30. package/dist/components/button/style.js.map +1 -1
  31. package/dist/components/button-group/index.d.ts +1 -2
  32. package/dist/components/button-group/index.js +19 -23
  33. package/dist/components/button-group/index.js.map +1 -1
  34. package/dist/components/checkbox/index.d.ts +4 -7
  35. package/dist/components/checkbox/index.js +48 -37
  36. package/dist/components/checkbox/index.js.map +1 -1
  37. package/dist/components/checkbox/style.js +1 -1
  38. package/dist/components/checkbox/style.js.map +1 -1
  39. package/dist/components/checkbox-group/index.d.ts +4 -10
  40. package/dist/components/checkbox-group/index.js +74 -60
  41. package/dist/components/checkbox-group/index.js.map +1 -1
  42. package/dist/components/context-menu/index.js +7 -8
  43. package/dist/components/context-menu/index.js.map +1 -1
  44. package/dist/components/dialog/index.d.ts +1 -0
  45. package/dist/components/dialog/index.js +13 -9
  46. package/dist/components/dialog/index.js.map +1 -1
  47. package/dist/components/dialog/style.js +1 -1
  48. package/dist/components/dialog/style.js.map +1 -1
  49. package/dist/components/drawer/index.d.ts +15 -0
  50. package/dist/components/drawer/index.js +58 -34
  51. package/dist/components/drawer/index.js.map +1 -1
  52. package/dist/components/drawer/style.js +1 -1
  53. package/dist/components/drawer/style.js.map +1 -1
  54. package/dist/components/dropdown/index.js +1 -1
  55. package/dist/components/dropdown-divider/index.js +1 -1
  56. package/dist/components/dropdown-header/index.js +1 -1
  57. package/dist/components/dropdown-header/style.js +1 -1
  58. package/dist/components/dropdown-header/style.js.map +1 -1
  59. package/dist/components/dropdown-item/index.js +3 -2
  60. package/dist/components/dropdown-item/index.js.map +1 -1
  61. package/dist/components/empty/index.js +1 -1
  62. package/dist/components/empty/style.js +1 -1
  63. package/dist/components/empty/style.js.map +1 -1
  64. package/dist/components/icon/index.js +1 -1
  65. package/dist/components/index.d.ts +1 -1
  66. package/dist/components/index.js +9 -9
  67. package/dist/components/input/index.d.ts +2 -3
  68. package/dist/components/input/index.js +62 -52
  69. package/dist/components/input/index.js.map +1 -1
  70. package/dist/components/input/style.js +1 -1
  71. package/dist/components/input/style.js.map +1 -1
  72. package/dist/components/input-number/index.d.ts +2 -3
  73. package/dist/components/input-number/index.js +58 -38
  74. package/dist/components/input-number/index.js.map +1 -1
  75. package/dist/components/input-number/style.js +1 -1
  76. package/dist/components/input-number/style.js.map +1 -1
  77. package/dist/components/layout/index.d.ts +53 -3
  78. package/dist/components/layout/index.js +146 -39
  79. package/dist/components/layout/index.js.map +1 -1
  80. package/dist/components/layout/style.js +1 -1
  81. package/dist/components/layout/style.js.map +1 -1
  82. package/dist/components/option/index.js +1 -1
  83. package/dist/components/option/style.js +1 -1
  84. package/dist/components/option/style.js.map +1 -1
  85. package/dist/components/popover/index.js +7 -5
  86. package/dist/components/popover/index.js.map +1 -1
  87. package/dist/components/popover/style.js +1 -1
  88. package/dist/components/popover/style.js.map +1 -1
  89. package/dist/components/radio/index.d.ts +4 -7
  90. package/dist/components/radio/index.js +48 -37
  91. package/dist/components/radio/index.js.map +1 -1
  92. package/dist/components/radio/style.js +1 -1
  93. package/dist/components/radio/style.js.map +1 -1
  94. package/dist/components/radio-group/index.d.ts +4 -10
  95. package/dist/components/radio-group/index.js +70 -52
  96. package/dist/components/radio-group/index.js.map +1 -1
  97. package/dist/components/segmented/index.d.ts +6 -11
  98. package/dist/components/segmented/index.js +67 -55
  99. package/dist/components/segmented/index.js.map +1 -1
  100. package/dist/components/segmented/style.js +1 -1
  101. package/dist/components/segmented/style.js.map +1 -1
  102. package/dist/components/segmented-trigger/index.d.ts +1 -2
  103. package/dist/components/segmented-trigger/index.js +18 -19
  104. package/dist/components/segmented-trigger/index.js.map +1 -1
  105. package/dist/components/segmented-trigger/style.js +1 -1
  106. package/dist/components/segmented-trigger/style.js.map +1 -1
  107. package/dist/components/select/index.d.ts +13 -8
  108. package/dist/components/select/index.js +110 -75
  109. package/dist/components/select/index.js.map +1 -1
  110. package/dist/components/select/style.js +1 -1
  111. package/dist/components/select/style.js.map +1 -1
  112. package/dist/components/slider/index.d.ts +3 -5
  113. package/dist/components/slider/index.js +59 -42
  114. package/dist/components/slider/index.js.map +1 -1
  115. package/dist/components/slider/style.js +1 -1
  116. package/dist/components/slider/style.js.map +1 -1
  117. package/dist/components/spinner/index.d.ts +0 -2
  118. package/dist/components/spinner/index.js +14 -13
  119. package/dist/components/spinner/index.js.map +1 -1
  120. package/dist/components/spinner/style.js +1 -1
  121. package/dist/components/spinner/style.js.map +1 -1
  122. package/dist/components/svg-draw-lines/index.js +1 -1
  123. package/dist/components/switch/index.d.ts +5 -6
  124. package/dist/components/switch/index.js +51 -37
  125. package/dist/components/switch/index.js.map +1 -1
  126. package/dist/components/switch/style.js +1 -1
  127. package/dist/components/switch/style.js.map +1 -1
  128. package/dist/components/textarea/index.d.ts +5 -6
  129. package/dist/components/textarea/index.js +73 -63
  130. package/dist/components/textarea/index.js.map +1 -1
  131. package/dist/components/textarea/style.js +1 -1
  132. package/dist/components/textarea/style.js.map +1 -1
  133. package/dist/components/theme/index.js +1 -1
  134. package/dist/components/theme/style.js +1 -1
  135. package/dist/components/theme/style.js.map +1 -1
  136. package/dist/components/toast/style.js +1 -1
  137. package/dist/components/toast/style.js.map +1 -1
  138. package/dist/components/toast/toast.js +12 -12
  139. package/dist/components/toast/toast.js.map +1 -1
  140. package/dist/components/tooltip/index.js +1 -1
  141. package/dist/components/tooltip/style.js +1 -1
  142. package/dist/components/tooltip/style.js.map +1 -1
  143. package/dist/icons/generated/lucide-clapperboard.d.ts +6 -0
  144. package/dist/icons/generated/lucide-clapperboard.js +10 -0
  145. package/dist/icons/generated/lucide-clapperboard.js.map +1 -0
  146. package/dist/icons/generated/lucide-external-link.d.ts +6 -0
  147. package/dist/icons/generated/lucide-external-link.js +10 -0
  148. package/dist/icons/generated/lucide-external-link.js.map +1 -0
  149. package/dist/icons/generated/lucide-eye.d.ts +6 -0
  150. package/dist/icons/generated/lucide-eye.js +10 -0
  151. package/dist/icons/generated/lucide-eye.js.map +1 -0
  152. package/dist/icons/generated/lucide-file-text.d.ts +6 -0
  153. package/dist/icons/generated/lucide-file-text.js +10 -0
  154. package/dist/icons/generated/lucide-file-text.js.map +1 -0
  155. package/dist/icons/generated/lucide-film.d.ts +6 -0
  156. package/dist/icons/generated/lucide-film.js +10 -0
  157. package/dist/icons/generated/lucide-film.js.map +1 -0
  158. package/dist/icons/generated/lucide-folder-open.d.ts +6 -0
  159. package/dist/icons/generated/lucide-folder-open.js +10 -0
  160. package/dist/icons/generated/lucide-folder-open.js.map +1 -0
  161. package/dist/icons/generated/lucide-headphones.d.ts +6 -0
  162. package/dist/icons/generated/lucide-headphones.js +10 -0
  163. package/dist/icons/generated/lucide-headphones.js.map +1 -0
  164. package/dist/icons/generated/lucide-layout-grid.d.ts +6 -0
  165. package/dist/icons/generated/lucide-layout-grid.js +10 -0
  166. package/dist/icons/generated/lucide-layout-grid.js.map +1 -0
  167. package/dist/icons/generated/lucide-link.d.ts +6 -0
  168. package/dist/icons/generated/lucide-link.js +10 -0
  169. package/dist/icons/generated/lucide-link.js.map +1 -0
  170. package/dist/icons/generated/lucide-music.d.ts +6 -0
  171. package/dist/icons/generated/lucide-music.js +10 -0
  172. package/dist/icons/generated/lucide-music.js.map +1 -0
  173. package/dist/icons/generated/lucide-package.d.ts +6 -0
  174. package/dist/icons/generated/lucide-package.js +10 -0
  175. package/dist/icons/generated/lucide-package.js.map +1 -0
  176. package/dist/icons/generated/lucide-pen-line.d.ts +6 -0
  177. package/dist/icons/generated/lucide-pen-line.js +10 -0
  178. package/dist/icons/generated/lucide-pen-line.js.map +1 -0
  179. package/dist/icons/generated/lucide-pencil.d.ts +6 -0
  180. package/dist/icons/generated/lucide-pencil.js +10 -0
  181. package/dist/icons/generated/lucide-pencil.js.map +1 -0
  182. package/dist/icons/generated/lucide-play.d.ts +6 -0
  183. package/dist/icons/generated/lucide-play.js +10 -0
  184. package/dist/icons/generated/lucide-play.js.map +1 -0
  185. package/dist/icons/generated/lucide-refresh-cw.d.ts +6 -0
  186. package/dist/icons/generated/lucide-refresh-cw.js +10 -0
  187. package/dist/icons/generated/lucide-refresh-cw.js.map +1 -0
  188. package/dist/icons/generated/lucide-sliders-horizontal.d.ts +6 -0
  189. package/dist/icons/generated/lucide-sliders-horizontal.js +10 -0
  190. package/dist/icons/generated/lucide-sliders-horizontal.js.map +1 -0
  191. package/dist/icons/generated/lucide-tags.d.ts +6 -0
  192. package/dist/icons/generated/lucide-tags.js +10 -0
  193. package/dist/icons/generated/lucide-tags.js.map +1 -0
  194. package/dist/icons/generated/lucide-wrench.d.ts +6 -0
  195. package/dist/icons/generated/lucide-wrench.js +10 -0
  196. package/dist/icons/generated/lucide-wrench.js.map +1 -0
  197. package/dist/icons/index.d.ts +18 -0
  198. package/dist/icons/index.js +19 -1
  199. package/dist/node_modules/.pnpm/@floating-ui_core@1.8.0/node_modules/@floating-ui/core/dist/floating-ui.core.js +1 -3
  200. package/dist/node_modules/.pnpm/@floating-ui_core@1.8.0/node_modules/@floating-ui/core/dist/floating-ui.core.js.map +1 -1
  201. package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +2 -1
  202. package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -1
  203. package/dist/shared/events/user-change.js.map +1 -1
  204. package/dist/shared/form-association/index.js +41 -0
  205. package/dist/shared/form-association/index.js.map +1 -0
  206. package/dist/shared/group-management/index.js +109 -0
  207. package/dist/shared/group-management/index.js.map +1 -0
  208. package/dist/shared/menu-portal/menu-tree.js +20 -7
  209. package/dist/shared/menu-portal/menu-tree.js.map +1 -1
  210. package/dist/shared/option-portal/index.js +65 -0
  211. package/dist/shared/option-portal/index.js.map +1 -0
  212. package/dist/shared/overlay/overlay.js +1 -1
  213. package/dist/shared/overlay/overlay.js.map +1 -1
  214. package/dist/shared/overlay/portal.js +9 -6
  215. package/dist/shared/overlay/portal.js.map +1 -1
  216. package/dist/shared/overlay/presence.js.map +1 -1
  217. package/dist/shared/visible-area/index.js +69 -0
  218. package/dist/shared/visible-area/index.js.map +1 -0
  219. package/dist/types/utils.d.ts +6 -1
  220. package/package.json +7 -5
@@ -1,22 +1,37 @@
1
- import e from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
1
+ import e from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
2
2
  import "../icon/index.js";
3
3
  import t from "../../icons/generated/lucide-plus.js";
4
4
  import n from "../../icons/generated/lucide-minus.js";
5
5
  import r from "../../assets/glass.js";
6
- import { normalizeNumber as i } from "../../shared/normalize/index.js";
7
- import a from "./style.js";
8
- import { LitElement as o, html as s, unsafeCSS as c } from "lit";
9
- import { customElement as l, property as u, state as d } from "lit/decorators.js";
6
+ import { FormAssociationController as i, defineFormAssociation as a } from "../../shared/form-association/index.js";
7
+ import { normalizeNumber as o } from "../../shared/normalize/index.js";
8
+ import s from "./style.js";
9
+ import { LitElement as c, html as l, unsafeCSS as u } from "lit";
10
+ import { customElement as d, property as f, state as p } from "lit/decorators.js";
10
11
  //#region src/components/input-number/index.ts
11
- var f = class extends o {
12
+ var m = class extends c {
12
13
  constructor(...e) {
13
- super(...e), this.placeholder = "", this.name = "", this.disabled = !1, this.readonly = !1, this.required = !1, this._value = 0, this._min = 0, this._max = Infinity, this._step = 1, this._focused = !1, this._formDisabled = !1, this._precision = 0;
14
+ super(...e), this.placeholder = "", this.name = "", this.disabled = !1, this.readonly = !1, this.required = !1, this._value = 0, this._min = 0, this._max = Infinity, this._step = 1, this._focused = !1, this._precision = 0, this._formAssociation = a({
15
+ host: this,
16
+ getState: () => this._value,
17
+ setState: (e) => {
18
+ this.value = e;
19
+ },
20
+ getFormValue: () => String(this._value),
21
+ getFormState: () => String(this._value),
22
+ restoreState: (e) => {
23
+ if (typeof e != "string") return;
24
+ let t = Number(e);
25
+ Number.isFinite(t) && (this.value = t);
26
+ },
27
+ syncValidity: () => this._syncValidity()
28
+ }).make(), this._formAssociationController = new i(this, this._formAssociation);
14
29
  }
15
30
  static {
16
31
  this.formAssociated = !0;
17
32
  }
18
33
  static {
19
- this.styles = [c(r), c(a)];
34
+ this.styles = [u(r), u(s)];
20
35
  }
21
36
  get precision() {
22
37
  return this._precision;
@@ -25,35 +40,35 @@ var f = class extends o {
25
40
  let t = this._precision;
26
41
  this._precision = e;
27
42
  let n = this.clamp(this.round(this._value));
28
- n !== this._value && (this._value = n, this._internals?.setFormValue?.(String(n))), this.requestUpdate("precision", t);
43
+ n !== this._value && (this._value = n, this._formAssociation.sync()), this.requestUpdate("precision", t);
29
44
  }
30
45
  get value() {
31
46
  return this._value;
32
47
  }
33
48
  set value(e) {
34
49
  let t = this.clamp(this.round(e)), n = this._value;
35
- this._value = t, this._internals?.setFormValue?.(String(t)), this.requestUpdate("value", n);
50
+ this._value = t, this._formAssociation.sync(), this.requestUpdate("value", n);
36
51
  }
37
52
  get _isDisabled() {
38
- return this.disabled || this._formDisabled;
53
+ return this.disabled || this._formAssociation.isFormDisabled();
39
54
  }
40
55
  get min() {
41
56
  return this._min;
42
57
  }
43
58
  set min(e) {
44
- this._min = i(e, -Infinity, Infinity, 0);
59
+ this._min = o(e, -Infinity, Infinity, 0);
45
60
  }
46
61
  get max() {
47
62
  return this._max;
48
63
  }
49
64
  set max(e) {
50
- this._max = i(e, -Infinity, Infinity, Infinity);
65
+ this._max = o(e, -Infinity, Infinity, Infinity);
51
66
  }
52
67
  get step() {
53
68
  return this._step;
54
69
  }
55
70
  set step(e) {
56
- this._step = i(e, 0, Infinity, 1);
71
+ this._step = o(e, 0, Infinity, 1);
57
72
  }
58
73
  get _effectiveStep() {
59
74
  return this._step;
@@ -64,31 +79,27 @@ var f = class extends o {
64
79
  get atMax() {
65
80
  return this._value >= this._max;
66
81
  }
67
- connectedCallback() {
68
- super.connectedCallback(), this._internals ||= this.attachInternals(), this._internals.setFormValue?.(String(this._value));
69
- }
70
82
  formResetCallback() {
71
- let e = this.getAttribute("value");
72
- this.value = e === null ? 0 : Number(e);
83
+ this._formAssociation.reset();
73
84
  }
74
85
  formDisabledCallback(e) {
75
- this._formDisabled = e;
86
+ this._formAssociation.setDisabled(e);
76
87
  }
77
88
  formStateRestoreCallback(e) {
78
- typeof e == "string" && (this.value = Number(e));
89
+ this._formAssociation.restore(e);
79
90
  }
80
91
  updated() {
81
92
  this._syncValidity(), this.toggleAttribute("focused", this._focused);
82
93
  }
83
94
  _syncValidity() {
84
- let e = this.shadowRoot?.querySelector("input");
85
- if (!this._internals || !e || typeof this._internals.setValidity != "function") return;
95
+ let e = this.shadowRoot?.querySelector("input"), t = this._formAssociation.getInternals();
96
+ if (!t || !e || typeof t.setValidity != "function") return;
86
97
  if (this._isDisabled || e.validity.valid) {
87
- this._internals.setValidity({});
98
+ t.setValidity({});
88
99
  return;
89
100
  }
90
- let t = {};
91
- e.validity.valueMissing && (t.valueMissing = !0), e.validity.rangeUnderflow && (t.rangeUnderflow = !0), e.validity.rangeOverflow && (t.rangeOverflow = !0), e.validity.stepMismatch && (t.stepMismatch = !0), this._internals.setValidity(t, e.validationMessage, e);
101
+ let n = {};
102
+ e.validity.valueMissing && (n.valueMissing = !0), e.validity.rangeUnderflow && (n.rangeUnderflow = !0), e.validity.rangeOverflow && (n.rangeOverflow = !0), e.validity.stepMismatch && (n.stepMismatch = !0), t.setValidity(n, e.validationMessage, e);
92
103
  }
93
104
  clamp(e) {
94
105
  return Math.min(this._max, Math.max(this._min, e));
@@ -109,12 +120,12 @@ var f = class extends o {
109
120
  handleInput(e) {
110
121
  if (this.readonly || !(e.target instanceof HTMLInputElement)) return;
111
122
  let t = e.target.value;
112
- t !== "" && t !== "-" && (this._value = this.clamp(this.round(Number(t))), this._internals?.setFormValue?.(String(this._value)), this._syncValidity());
123
+ t !== "" && t !== "-" && (this._value = this.clamp(this.round(Number(t))), this._formAssociation.sync(), this._syncValidity());
113
124
  }
114
125
  handleNativeChange(e) {
115
126
  if (this.readonly || !(e.target instanceof HTMLInputElement)) return;
116
127
  let t = e.target.value;
117
- t !== "" && t !== "-" && (this._value = this.clamp(this.round(Number(t))), this._internals?.setFormValue?.(String(this._value)), this._syncValidity(), this.dispatchEvent(new Event("change", {
128
+ t !== "" && t !== "-" && (this._value = this.clamp(this.round(Number(t))), this._formAssociation.sync(), this._syncValidity(), this.dispatchEvent(new Event("change", {
118
129
  bubbles: !0,
119
130
  composed: !0
120
131
  })));
@@ -135,7 +146,7 @@ var f = class extends o {
135
146
  this._focused = !1;
136
147
  }
137
148
  render() {
138
- return s`
149
+ return l`
139
150
  <div class="wui-glass wui-input-inner">
140
151
  <button
141
152
  class="num-btn"
@@ -171,29 +182,38 @@ var f = class extends o {
171
182
  `;
172
183
  }
173
184
  };
174
- e([u({
185
+ e([f({
175
186
  type: String,
176
187
  reflect: !0
177
- })], f.prototype, "placeholder", void 0), e([u({
188
+ })], m.prototype, "placeholder", void 0), e([f({
178
189
  type: String,
179
190
  reflect: !0
180
- })], f.prototype, "name", void 0), e([u({
191
+ })], m.prototype, "name", void 0), e([f({
181
192
  type: Boolean,
182
193
  reflect: !0
183
- })], f.prototype, "disabled", void 0), e([u({
194
+ })], m.prototype, "disabled", void 0), e([f({
184
195
  type: Boolean,
185
196
  reflect: !0
186
- })], f.prototype, "readonly", void 0), e([u({
197
+ })], m.prototype, "readonly", void 0), e([f({
187
198
  type: Boolean,
188
199
  reflect: !0
189
- })], f.prototype, "required", void 0), e([u({
200
+ })], m.prototype, "required", void 0), e([f({
201
+ type: Number,
202
+ reflect: !0
203
+ })], m.prototype, "precision", null), e([p()], m.prototype, "_value", void 0), e([p()], m.prototype, "_min", void 0), e([p()], m.prototype, "_max", void 0), e([p()], m.prototype, "_step", void 0), e([p()], m.prototype, "_focused", void 0), e([f({
204
+ type: Number,
205
+ reflect: !0
206
+ })], m.prototype, "value", null), e([f({
207
+ type: Number,
208
+ reflect: !0
209
+ })], m.prototype, "min", null), e([f({
190
210
  type: Number,
191
211
  reflect: !0
192
- })], f.prototype, "precision", null), e([d()], f.prototype, "_value", void 0), e([d()], f.prototype, "_min", void 0), e([d()], f.prototype, "_max", void 0), e([d()], f.prototype, "_step", void 0), e([d()], f.prototype, "_focused", void 0), e([d()], f.prototype, "_formDisabled", void 0), e([u({
212
+ })], m.prototype, "max", null), e([f({
193
213
  type: Number,
194
214
  reflect: !0
195
- })], f.prototype, "value", null), e([u({ type: Number })], f.prototype, "min", null), e([u({ type: Number })], f.prototype, "max", null), e([u({ type: Number })], f.prototype, "step", null), f = e([l("web-ui-input-number")], f);
215
+ })], m.prototype, "step", null), m = e([d("web-ui-input-number")], m);
196
216
  //#endregion
197
- export { f as WebUiInputNumber };
217
+ export { m as WebUiInputNumber };
198
218
 
199
219
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/input-number/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport '@/components/icon'\nimport glass from '@/assets/glass.css?inline'\nimport { lucideMinus, lucidePlus } from '@/icons'\nimport { normalizeNumber } from '@/shared/normalize'\n\nimport style from './style.css?inline'\n\n@customElement('web-ui-input-number')\nexport class WebUiInputNumber extends LitElement {\n static formAssociated = true\n static override styles = [unsafeCSS(glass), unsafeCSS(style)]\n\n @property({ type: String, reflect: true }) placeholder = ''\n @property({ type: String, reflect: true }) name = ''\n @property({ type: Boolean, reflect: true }) disabled = false\n @property({ type: Boolean, reflect: true }) readonly = false\n @property({ type: Boolean, reflect: true }) required = false\n @property({ type: Number, reflect: true })\n get precision(): number {\n return this._precision\n }\n // 精度变化时重算现有值,避免浮点累积误差\n set precision(v: number) {\n const old = this._precision\n this._precision = v\n const current = this.clamp(this.round(this._value))\n if (current !== this._value) {\n this._value = current\n this._internals?.setFormValue?.(String(current))\n }\n this.requestUpdate('precision', old)\n }\n\n @state() private _value = 0\n @state() private _min = 0\n @state() private _max = Infinity\n @state() private _step = 1\n @state() private _focused = false\n @state() private _formDisabled = false\n private _precision = 0\n\n private _internals?: ElementInternals\n\n @property({ type: Number, reflect: true })\n get value(): number {\n return this._value\n }\n\n set value(v: number) {\n const clamped = this.clamp(this.round(v))\n const old = this._value\n this._value = clamped\n this._internals?.setFormValue?.(String(clamped))\n this.requestUpdate('value', old)\n }\n\n private get _isDisabled(): boolean {\n return this.disabled || this._formDisabled\n }\n\n @property({ type: Number })\n get min(): number {\n return this._min\n }\n\n set min(v: unknown) {\n this._min = normalizeNumber(v, -Infinity, Infinity, 0)\n }\n\n @property({ type: Number })\n get max(): number {\n return this._max\n }\n\n set max(v: unknown) {\n this._max = normalizeNumber(v, -Infinity, Infinity, Infinity)\n }\n\n @property({ type: Number })\n get step(): number {\n return this._step\n }\n\n // 步进值,默认 1;若声明了 precision 则以 precision 退化步进\n set step(v: unknown) {\n this._step = normalizeNumber(v, 0, Infinity, 1)\n }\n\n private get _effectiveStep(): number {\n return this._step\n }\n\n private get atMin(): boolean {\n return this._value <= this._min\n }\n\n private get atMax(): boolean {\n return this._value >= this._max\n }\n\n override connectedCallback() {\n super.connectedCallback()\n if (!this._internals) {\n this._internals = this.attachInternals()\n }\n this._internals.setFormValue?.(String(this._value))\n }\n\n formResetCallback() {\n const attr = this.getAttribute('value')\n this.value = attr !== null ? Number(attr) : 0\n }\n\n formDisabledCallback(disabled: boolean) {\n this._formDisabled = disabled\n }\n\n formStateRestoreCallback(state: string | File | FormData | null) {\n if (typeof state === 'string') this.value = Number(state)\n }\n\n override updated() {\n this._syncValidity()\n this.toggleAttribute('focused', this._focused)\n }\n\n private _syncValidity() {\n const input = this.shadowRoot?.querySelector('input')\n if (!this._internals || !input || typeof this._internals.setValidity !== 'function') return\n if (this._isDisabled || input.validity.valid) {\n this._internals.setValidity({})\n return\n }\n const flags: ValidityStateFlags = {}\n if (input.validity.valueMissing) flags.valueMissing = true\n if (input.validity.rangeUnderflow) flags.rangeUnderflow = true\n if (input.validity.rangeOverflow) flags.rangeOverflow = true\n if (input.validity.stepMismatch) flags.stepMismatch = true\n this._internals.setValidity(flags, input.validationMessage, input)\n }\n\n private clamp(v: number): number {\n return Math.min(this._max, Math.max(this._min, v))\n }\n\n private round(v: number): number {\n const f = 10 ** this.precision\n return Math.round(v * f) / f\n }\n\n private setValueAndNotify(v: number) {\n this.value = this.clamp(this.round(v))\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }))\n }\n\n private handleStep(direction: 1 | -1) {\n if (this._isDisabled || this.readonly) return\n this.setValueAndNotify(this._value + direction * this._effectiveStep)\n }\n\n private handleInput(e: Event) {\n if (this.readonly) return\n if (!(e.target instanceof HTMLInputElement)) return\n const raw = e.target.value\n if (raw === '' || raw === '-') return\n this._value = this.clamp(this.round(Number(raw)))\n this._internals?.setFormValue?.(String(this._value))\n this._syncValidity()\n }\n\n // 原生 change 不 composed,被 shadow root 挡住;文本失焦提交时补发 composed 事件,\n // 与 ArrowUp/ArrowDown 的 change 行为对齐。\n private handleNativeChange(e: Event) {\n if (this.readonly) return\n if (!(e.target instanceof HTMLInputElement)) return\n const raw = e.target.value\n if (raw === '' || raw === '-') return\n this._value = this.clamp(this.round(Number(raw)))\n this._internals?.setFormValue?.(String(this._value))\n this._syncValidity()\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }))\n }\n\n private handleKeydown(e: KeyboardEvent) {\n if (this._isDisabled || this.readonly) return\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n this.setValueAndNotify(this._value + this._effectiveStep)\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }))\n } else if (e.key === 'ArrowDown') {\n e.preventDefault()\n this.setValueAndNotify(this._value - this._effectiveStep)\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }))\n }\n }\n\n private handleFocus() {\n if (!this._isDisabled) this._focused = true\n }\n\n private handleBlur() {\n this._focused = false\n }\n\n override render() {\n return html`\n <div class=\"wui-glass wui-input-inner\">\n <button\n class=\"num-btn\"\n aria-label=\"Decrease\"\n ?disabled=${this._isDisabled || this.readonly || this.atMin}\n @click=${() => this.handleStep(-1)}\n >\n <web-ui-icon .icon=${lucideMinus}></web-ui-icon>\n </button>\n <input\n type=\"number\"\n placeholder=${this.placeholder}\n name=${this.name}\n .value=${String(this._value)}\n ?disabled=${this._isDisabled}\n ?readonly=${this.readonly}\n ?required=${this.required}\n @input=${this.handleInput}\n @change=${this.handleNativeChange}\n @keydown=${this.handleKeydown}\n @focus=${this.handleFocus}\n @blur=${this.handleBlur}\n />\n <button\n class=\"num-btn\"\n aria-label=\"Increase\"\n ?disabled=${this._isDisabled || this.readonly || this.atMax}\n @click=${() => this.handleStep(1)}\n >\n <web-ui-icon .icon=${lucidePlus}></web-ui-icon>\n </button>\n </div>\n `\n }\n\n declare readonly $events: {\n input: Event\n change: Event\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-input-number': WebUiInputNumber\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/input-number/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport '@/components/icon'\nimport glass from '@/assets/glass.css?inline'\nimport { lucideMinus, lucidePlus } from '@/icons'\nimport { defineFormAssociation, FormAssociationController } from '@/shared/form-association'\nimport { normalizeNumber } from '@/shared/normalize'\n\nimport style from './style.css?inline'\n\n@customElement('web-ui-input-number')\nexport class WebUiInputNumber extends LitElement {\n static formAssociated = true\n static override styles = [unsafeCSS(glass), unsafeCSS(style)]\n\n @property({ type: String, reflect: true }) placeholder = ''\n @property({ type: String, reflect: true }) name = ''\n @property({ type: Boolean, reflect: true }) disabled = false\n @property({ type: Boolean, reflect: true }) readonly = false\n @property({ type: Boolean, reflect: true }) required = false\n @property({ type: Number, reflect: true })\n get precision(): number {\n return this._precision\n }\n // 精度变化时重算现有值,避免浮点累积误差\n set precision(v: number) {\n const old = this._precision\n this._precision = v\n const current = this.clamp(this.round(this._value))\n if (current !== this._value) {\n this._value = current\n this._formAssociation.sync()\n }\n this.requestUpdate('precision', old)\n }\n\n @state() private _value = 0\n @state() private _min = 0\n @state() private _max = Infinity\n @state() private _step = 1\n @state() private _focused = false\n private _precision = 0\n\n @property({ type: Number, reflect: true })\n get value(): number {\n return this._value\n }\n\n set value(v: number) {\n const clamped = this.clamp(this.round(v))\n const old = this._value\n this._value = clamped\n this._formAssociation.sync()\n this.requestUpdate('value', old)\n }\n\n private get _isDisabled(): boolean {\n return this.disabled || this._formAssociation.isFormDisabled()\n }\n\n @property({ type: Number, reflect: true })\n get min(): number {\n return this._min\n }\n\n set min(v: unknown) {\n this._min = normalizeNumber(v, -Infinity, Infinity, 0)\n }\n\n @property({ type: Number, reflect: true })\n get max(): number {\n return this._max\n }\n\n set max(v: unknown) {\n this._max = normalizeNumber(v, -Infinity, Infinity, Infinity)\n }\n\n @property({ type: Number, reflect: true })\n get step(): number {\n return this._step\n }\n\n // 步进值,默认 1;若声明了 precision 则以 precision 退化步进\n set step(v: unknown) {\n this._step = normalizeNumber(v, 0, Infinity, 1)\n }\n\n private get _effectiveStep(): number {\n return this._step\n }\n\n private get atMin(): boolean {\n return this._value <= this._min\n }\n\n private get atMax(): boolean {\n return this._value >= this._max\n }\n\n private readonly _formAssociation = defineFormAssociation<number>({\n host: this,\n getState: () => this._value,\n setState: value => {\n this.value = value\n },\n getFormValue: () => String(this._value),\n getFormState: () => String(this._value),\n restoreState: state => {\n if (typeof state !== 'string') return\n const value = Number(state)\n if (Number.isFinite(value)) this.value = value\n },\n syncValidity: () => this._syncValidity()\n }).make()\n\n private readonly _formAssociationController = new FormAssociationController(this, this._formAssociation)\n\n formResetCallback() {\n this._formAssociation.reset()\n }\n\n formDisabledCallback(disabled: boolean) {\n this._formAssociation.setDisabled(disabled)\n }\n\n formStateRestoreCallback(state: string | File | FormData | null) {\n this._formAssociation.restore(state)\n }\n\n override updated() {\n this._syncValidity()\n this.toggleAttribute('focused', this._focused)\n }\n\n private _syncValidity() {\n const input = this.shadowRoot?.querySelector('input')\n const internals = this._formAssociation.getInternals()\n if (!internals || !input || typeof internals.setValidity !== 'function') return\n if (this._isDisabled || input.validity.valid) {\n internals.setValidity({})\n return\n }\n const flags: ValidityStateFlags = {}\n if (input.validity.valueMissing) flags.valueMissing = true\n if (input.validity.rangeUnderflow) flags.rangeUnderflow = true\n if (input.validity.rangeOverflow) flags.rangeOverflow = true\n if (input.validity.stepMismatch) flags.stepMismatch = true\n internals.setValidity(flags, input.validationMessage, input)\n }\n\n private clamp(v: number): number {\n return Math.min(this._max, Math.max(this._min, v))\n }\n\n private round(v: number): number {\n const f = 10 ** this.precision\n return Math.round(v * f) / f\n }\n\n private setValueAndNotify(v: number) {\n this.value = this.clamp(this.round(v))\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }))\n }\n\n private handleStep(direction: 1 | -1) {\n if (this._isDisabled || this.readonly) return\n this.setValueAndNotify(this._value + direction * this._effectiveStep)\n }\n\n private handleInput(e: Event) {\n if (this.readonly) return\n if (!(e.target instanceof HTMLInputElement)) return\n const raw = e.target.value\n if (raw === '' || raw === '-') return\n this._value = this.clamp(this.round(Number(raw)))\n this._formAssociation.sync()\n this._syncValidity()\n }\n\n // 原生 change 不 composed,被 shadow root 挡住;文本失焦提交时补发 composed 事件,\n // 与 ArrowUp/ArrowDown 的 change 行为对齐。\n private handleNativeChange(e: Event) {\n if (this.readonly) return\n if (!(e.target instanceof HTMLInputElement)) return\n const raw = e.target.value\n if (raw === '' || raw === '-') return\n this._value = this.clamp(this.round(Number(raw)))\n this._formAssociation.sync()\n this._syncValidity()\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }))\n }\n\n private handleKeydown(e: KeyboardEvent) {\n if (this._isDisabled || this.readonly) return\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n this.setValueAndNotify(this._value + this._effectiveStep)\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }))\n } else if (e.key === 'ArrowDown') {\n e.preventDefault()\n this.setValueAndNotify(this._value - this._effectiveStep)\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }))\n }\n }\n\n private handleFocus() {\n if (!this._isDisabled) this._focused = true\n }\n\n private handleBlur() {\n this._focused = false\n }\n\n override render() {\n return html`\n <div class=\"wui-glass wui-input-inner\">\n <button\n class=\"num-btn\"\n aria-label=\"Decrease\"\n ?disabled=${this._isDisabled || this.readonly || this.atMin}\n @click=${() => this.handleStep(-1)}\n >\n <web-ui-icon .icon=${lucideMinus}></web-ui-icon>\n </button>\n <input\n type=\"number\"\n placeholder=${this.placeholder}\n name=${this.name}\n .value=${String(this._value)}\n ?disabled=${this._isDisabled}\n ?readonly=${this.readonly}\n ?required=${this.required}\n @input=${this.handleInput}\n @change=${this.handleNativeChange}\n @keydown=${this.handleKeydown}\n @focus=${this.handleFocus}\n @blur=${this.handleBlur}\n />\n <button\n class=\"num-btn\"\n aria-label=\"Increase\"\n ?disabled=${this._isDisabled || this.readonly || this.atMax}\n @click=${() => this.handleStep(1)}\n >\n <web-ui-icon .icon=${lucidePlus}></web-ui-icon>\n </button>\n </div>\n `\n }\n\n declare readonly $events: {\n input: Event\n change: Event\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-input-number': WebUiInputNumber\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  //#region src/components/input-number/style.css?inline
2
- var e = "*,:before,:after{box-sizing:border-box}:host{display:inline-block}:host([disabled]){cursor:not-allowed;opacity:.4}.wui-input-inner{box-sizing:border-box;width:var(--wui-input-width,200px);min-width:var(--wui-button-size,40px);height:var(--wui-button-size,40px);transition:border-color var(--wui-duration-focus,.2s), box-shadow var(--wui-duration-focus,.2s);border-radius:2147483647px;align-items:center;gap:4px;padding:0 4px;display:flex;position:relative}:host([focused]) .wui-input-inner{--wui-glass-shadow:var(--wui-shadow-glass,0 2px 16px #0000000f), 0 0 0 3px var(--wui-focus-ring,#08f6);border-color:var(--wui-color-border-strong,#006ee680)}input{min-width:48px;height:100%;font:inherit;font-size:var(--wui-font-size,14px);color:var(--wui-color-text,#1b1b1b);text-align:center;background:0 0;border:none;outline:none;flex:1;margin:0;padding:0}input::-webkit-inner-spin-button{appearance:none;margin:0}input::-webkit-outer-spin-button{appearance:none;margin:0}input[type=number]{appearance:textfield}input:disabled{cursor:not-allowed;opacity:.4}.num-btn{cursor:pointer;width:32px;height:32px;color:var(--wui-color-text-muted,#6a6a6a);transition:background-color var(--wui-duration-trigger,.16s) ease;background:0 0;border:none;border-radius:2147483647px;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.num-btn:disabled{cursor:not-allowed;opacity:.4}.num-btn:focus-visible{outline:3px solid var(--wui-focus-ring,#08f6);outline-offset:2px}@media (hover:hover) and (pointer:fine){.num-btn:hover:not(:disabled){background:color-mix(in srgb, var(--wui-color-text,#1b1b1b) 12%, transparent)}}.num-btn:active:not(:disabled){background:color-mix(in srgb, var(--wui-color-text,#1b1b1b) 18%, transparent)}@media (prefers-reduced-motion:reduce){.num-btn{transition:background-color var(--wui-duration-trigger,.16s) ease}}";
2
+ var e = "*,:before,:after{box-sizing:border-box}:host{display:inline-block}:host([disabled]){cursor:not-allowed;opacity:.4}.wui-input-inner{box-sizing:border-box;width:var(--wui-input-width,200px);min-width:var(--wui-control-size,40px);height:var(--wui-control-size,40px);transition:border-color var(--wui-duration-focus,.2s), box-shadow var(--wui-duration-focus,.2s);border-radius:2147483647px;align-items:center;gap:4px;padding:0 4px;display:flex;position:relative}:host([focused]) .wui-input-inner{--wui-internal-glass-focus-ring:inset 0 0 0 1px var(--wui-color-accent,#08f), 0 0 0 var(--wui-focus-ring-width,3px) var(--wui-color-focus-ring,#08f6)}input{min-width:48px;height:100%;font:inherit;font-size:var(--wui-font-size,14px);color:var(--wui-color-text,#1b1b1b);text-align:center;background:0 0;border:none;outline:none;flex:1;margin:0;padding:0}input::-webkit-inner-spin-button{appearance:none;margin:0}input::-webkit-outer-spin-button{appearance:none;margin:0}input[type=number]{appearance:textfield}input:disabled{cursor:not-allowed;opacity:.4}.num-btn{cursor:pointer;width:32px;height:32px;color:var(--wui-color-text-secondary,#6a6a6a);transition:background-color var(--wui-duration-trigger,.16s) ease;background:0 0;border:none;border-radius:2147483647px;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.num-btn:disabled{cursor:not-allowed;opacity:.4}.num-btn:focus-visible{outline:var(--wui-focus-ring-width,3px) solid var(--wui-color-focus-ring,#08f6);outline-offset:2px}@media (hover:hover) and (pointer:fine){.num-btn:hover:not(:disabled){background:var(--wui-color-state-layer-hover,color-mix(in srgb, var(--wui-color-text,#1b1b1b) 6%, transparent))}}.num-btn:active:not(:disabled){background:var(--wui-color-state-layer-active,color-mix(in srgb, var(--wui-color-text,#1b1b1b) 15%, transparent))}@media (prefers-reduced-motion:reduce){.num-btn{transition:background-color var(--wui-duration-trigger,.16s) ease}}";
3
3
  //#endregion
4
4
  export { e as default };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/input-number/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: inline-block;\n}\n\n:host([disabled]) {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wui-input-inner {\n position: relative;\n\n display: flex;\n gap: 4px;\n align-items: center;\n\n box-sizing: border-box;\n width: var(--wui-input-width, 200px);\n min-width: var(--wui-button-size, 40px);\n height: var(--wui-button-size, 40px);\n padding: 0 4px;\n border-radius: calc(infinity * 1px);\n\n transition:\n border-color var(--wui-duration-focus, 200ms),\n box-shadow var(--wui-duration-focus, 200ms);\n}\n\n:host([focused]) .wui-input-inner {\n --wui-glass-shadow:\n var(--wui-shadow-glass, 0 2px 16px rgb(0 0 0 / 0.06)), 0 0 0 3px var(--wui-focus-ring, rgb(0 136 255 / 0.4));\n border-color: var(--wui-color-border-strong, rgb(0 110 230 / 0.5));\n}\n\ninput {\n flex: 1;\n\n min-width: 48px;\n height: 100%;\n margin: 0;\n padding: 0;\n border: none;\n\n /* 表单控件不继承字体;显式继承以对齐宿主排版,避免 UA 默认字体差异 */\n font: inherit;\n font-size: var(--wui-font-size, 14px);\n color: var(--wui-color-text, #1b1b1b);\n text-align: center;\n\n background: transparent;\n outline: none;\n\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n margin: 0;\n appearance: none;\n }\n\n &[type='number'] {\n appearance: textfield;\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n }\n}\n\n.num-btn {\n cursor: pointer;\n\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: calc(infinity * 1px);\n\n color: var(--wui-color-text-muted, #6a6a6a);\n\n background: transparent;\n\n transition: background-color var(--wui-duration-trigger, 160ms) ease;\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n }\n\n &:focus-visible {\n outline: 3px solid var(--wui-focus-ring, rgb(0 136 255 / 0.4));\n outline-offset: 2px;\n }\n}\n\n@media (hover: hover) and (pointer: fine) {\n .num-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--wui-color-text, #1b1b1b) 12%, transparent);\n }\n}\n\n.num-btn:active:not(:disabled) {\n background: color-mix(in srgb, var(--wui-color-text, #1b1b1b) 18%, transparent);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .num-btn {\n transition: background-color var(--wui-duration-trigger, 160ms) ease;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/input-number/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: inline-block;\n}\n\n:host([disabled]) {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wui-input-inner {\n position: relative;\n\n display: flex;\n gap: 4px;\n align-items: center;\n\n box-sizing: border-box;\n width: var(--wui-input-width, 200px);\n min-width: var(--wui-control-size, 40px);\n height: var(--wui-control-size, 40px);\n padding: 0 4px;\n border-radius: calc(infinity * 1px);\n\n transition:\n border-color var(--wui-duration-focus, 200ms),\n box-shadow var(--wui-duration-focus, 200ms);\n}\n\n:host([focused]) .wui-input-inner {\n --wui-internal-glass-focus-ring:\n inset 0 0 0 1px var(--wui-color-accent, #08f),\n 0 0 0 var(--wui-focus-ring-width, 3px) var(--wui-color-focus-ring, rgb(0 136 255 / 0.4));\n}\n\ninput {\n flex: 1;\n\n min-width: 48px;\n height: 100%;\n margin: 0;\n padding: 0;\n border: none;\n\n /* 表单控件不继承字体;显式继承以对齐宿主排版,避免 UA 默认字体差异 */\n font: inherit;\n font-size: var(--wui-font-size, 14px);\n color: var(--wui-color-text, #1b1b1b);\n text-align: center;\n\n background: transparent;\n outline: none;\n\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n margin: 0;\n appearance: none;\n }\n\n &[type='number'] {\n appearance: textfield;\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n }\n}\n\n.num-btn {\n cursor: pointer;\n\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: calc(infinity * 1px);\n\n color: var(--wui-color-text-secondary, #6a6a6a);\n\n background: transparent;\n\n transition: background-color var(--wui-duration-trigger, 160ms) ease;\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n }\n\n &:focus-visible {\n outline: var(--wui-focus-ring-width, 3px) solid var(--wui-color-focus-ring, rgb(0 136 255 / 0.4));\n outline-offset: 2px;\n }\n}\n\n@media (hover: hover) and (pointer: fine) {\n .num-btn:hover:not(:disabled) {\n background: var(--wui-color-state-layer-hover, color-mix(in srgb, var(--wui-color-text, #1b1b1b) 6%, transparent));\n }\n}\n\n.num-btn:active:not(:disabled) {\n background: var(--wui-color-state-layer-active, color-mix(in srgb, var(--wui-color-text, #1b1b1b) 15%, transparent));\n}\n\n@media (prefers-reduced-motion: reduce) {\n .num-btn {\n transition: background-color var(--wui-duration-trigger, 160ms) ease;\n }\n}\n"],"mappings":""}
@@ -1,11 +1,61 @@
1
1
  import { LitElement } from 'lit';
2
+ /**
3
+ * Layout 组件 - 提供页面布局框架,支持可折叠侧边栏
4
+ *
5
+ * @fires sidebar-collapsed-change - 桌面端侧边栏折叠状态变更请求时触发
6
+ * @fires sidebar-open-change - 移动端侧边栏 Drawer 开关请求时触发
7
+ * @slot banner - 顶部 Banner 区域(全宽,随页面滚动,可选)
8
+ * @slot header - 内容区顶部 header(sticky)
9
+ * @slot sidebar - 侧边栏内容;Consumer 决定其内部固定区域与滚动容器
10
+ * @slot tabbar - 底部 tabbar 区域
11
+ * @slot default - 主内容区
12
+ */
2
13
  export declare class WebUiLayout extends LitElement {
3
14
  static styles: import('lit').CSSResult[];
4
- private _sidebarOpen;
15
+ /**
16
+ * 桌面端 Sidebar 的持久布局偏好。
17
+ *
18
+ * `true` 只会将桌面 Sidebar 收窄到 `collapsedWidth`,不会影响移动端 Drawer。
19
+ * 它不与 `sidebarOpen` 合并:前者是跨视口保留的密度选择,后者是移动端瞬时的 modal 可见性。
20
+ */
21
+ sidebarCollapsed: boolean;
22
+ sidebarWidth: string;
23
+ collapsedWidth: string;
24
+ /**
25
+ * 移动端 headless Drawer 的瞬时可见性。
26
+ *
27
+ * Drawer Toggle、Escape 和遮罩关闭都通过 `sidebar-open-change` 请求更新它;它不会改变桌面端的折叠偏好。
28
+ * 因而不与 `sidebarCollapsed` 合并,避免响应式切换时将一次移动端交互误写为桌面端布局选择。
29
+ */
30
+ sidebarOpen: boolean;
31
+ /**
32
+ * 启用 header 晕染效果
33
+ */
34
+ headerGlow: boolean;
35
+ private _isMobile;
36
+ private readonly _visibleBanner;
37
+ private readonly _visibleBannerController;
5
38
  private _toggleSidebar;
6
- private _closeSidebar;
7
- private _onSidebarClick;
39
+ private _emitSidebarCollapsedChange;
40
+ private _emitSidebarOpenChange;
41
+ private _onDrawerChange;
42
+ private _checkMobile;
43
+ private _resizeTimeout;
44
+ private _handleResize;
45
+ connectedCallback(): void;
46
+ disconnectedCallback(): void;
47
+ firstUpdated(): void;
48
+ private _onBannerSlotChange;
49
+ private _syncBannerPresence;
8
50
  render(): import('lit').TemplateResult<1>;
51
+ readonly $events: {
52
+ 'sidebar-collapsed-change': CustomEvent<{
53
+ collapsed: boolean;
54
+ }>;
55
+ 'sidebar-open-change': CustomEvent<{
56
+ open: boolean;
57
+ }>;
58
+ };
9
59
  }
10
60
  declare global {
11
61
  interface HTMLElementTagNameMap {
@@ -1,65 +1,172 @@
1
- import e from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
1
+ import e from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
2
2
  import "../icon/index.js";
3
3
  import t from "../../icons/generated/radix-icons-panel-left-minimized.js";
4
4
  import n from "../../assets/glass.js";
5
5
  import "../button/index.js";
6
- import r from "./style.js";
7
- import { LitElement as i, html as a, unsafeCSS as o } from "lit";
8
- import { customElement as s, state as c } from "lit/decorators.js";
9
- import { classMap as l } from "lit/directives/class-map.js";
6
+ import "../drawer/index.js";
7
+ import { VisibleAreaController as r, defineVisibleAreaTracker as i } from "../../shared/visible-area/index.js";
8
+ import a from "./style.js";
9
+ import { LitElement as o, html as s, unsafeCSS as c } from "lit";
10
+ import { customElement as l, property as u, state as d } from "lit/decorators.js";
11
+ import { classMap as f } from "lit/directives/class-map.js";
12
+ import { styleMap as p } from "lit/directives/style-map.js";
10
13
  //#region src/components/layout/index.ts
11
- var u = class extends i {
14
+ var m = class extends o {
12
15
  constructor(...e) {
13
- super(...e), this._sidebarOpen = !1;
16
+ super(...e), this.sidebarCollapsed = !1, this.sidebarWidth = "240px", this.collapsedWidth = "72px", this.sidebarOpen = !1, this.headerGlow = !1, this._isMobile = !1, this._visibleBanner = i({ onVisibleAreaChange: (e) => {
17
+ this.style.setProperty("--wui-layout-visible-banner-height", `${e.height}px`);
18
+ } }).make(), this._visibleBannerController = new r(this, this._visibleBanner), this._resizeTimeout = null, this._handleResize = () => {
19
+ this._resizeTimeout !== null && clearTimeout(this._resizeTimeout), this._resizeTimeout = setTimeout(() => {
20
+ this._checkMobile(), this._resizeTimeout = null;
21
+ }, 100);
22
+ };
14
23
  }
15
24
  static {
16
- this.styles = [o(n), o(r)];
25
+ this.styles = [c(n), c(a)];
17
26
  }
18
27
  _toggleSidebar() {
19
- this._sidebarOpen = !this._sidebarOpen;
28
+ if (this._isMobile) {
29
+ this._emitSidebarOpenChange(!this.sidebarOpen);
30
+ return;
31
+ }
32
+ this._emitSidebarCollapsedChange(!this.sidebarCollapsed);
20
33
  }
21
- _closeSidebar() {
22
- this._sidebarOpen = !1;
34
+ _emitSidebarCollapsedChange(e) {
35
+ this.dispatchEvent(new CustomEvent("sidebar-collapsed-change", {
36
+ detail: { collapsed: e },
37
+ bubbles: !0,
38
+ composed: !0
39
+ }));
23
40
  }
24
- _onSidebarClick(e) {
25
- e.target.closest("a, button, [role=\"button\"]") && this._closeSidebar();
41
+ _emitSidebarOpenChange(e) {
42
+ this.dispatchEvent(new CustomEvent("sidebar-open-change", {
43
+ detail: { open: e },
44
+ bubbles: !0,
45
+ composed: !0
46
+ }));
47
+ }
48
+ _onDrawerChange(e) {
49
+ e.stopPropagation(), this._emitSidebarOpenChange(e.detail.open);
50
+ }
51
+ _checkMobile() {
52
+ this._isMobile = window.innerWidth <= 640;
53
+ }
54
+ connectedCallback() {
55
+ super.connectedCallback(), this._checkMobile(), window.addEventListener("resize", this._handleResize), this.updateComplete.then(() => {
56
+ this.isConnected && this._syncBannerPresence();
57
+ });
58
+ }
59
+ disconnectedCallback() {
60
+ super.disconnectedCallback(), window.removeEventListener("resize", this._handleResize), this._resizeTimeout !== null && clearTimeout(this._resizeTimeout), this._resizeTimeout = null;
61
+ }
62
+ firstUpdated() {
63
+ this._syncBannerPresence();
64
+ }
65
+ _onBannerSlotChange() {
66
+ this._syncBannerPresence();
67
+ }
68
+ _syncBannerPresence() {
69
+ let e = this.renderRoot.querySelector("slot[name=\"banner\"]")?.assignedNodes().some((e) => e.nodeType === Node.ELEMENT_NODE || e.nodeType === Node.TEXT_NODE && !!e.textContent?.trim()) ?? !1, t = this.shadowRoot?.querySelector(".layout-banner") ?? null;
70
+ this._visibleBanner.setTarget(e ? t : null);
26
71
  }
27
72
  render() {
28
- return a`
29
- <div class="layout-grid">
30
- <header>
31
- <slot name="header"></slot>
32
- </header>
33
- <main>
34
- <slot></slot>
35
- </main>
36
- <aside class="${l({ open: this._sidebarOpen })}" @click="${this._onSidebarClick}">
37
- <div class="menu wui-glass"><slot name="sidebar"></slot></div>
38
- </aside>
39
- <footer>
40
- <slot name="tabbar"></slot>
41
- </footer>
42
- </div>
43
-
44
- <div class="${l({
45
- backdrop: !0,
46
- open: this._sidebarOpen
47
- })}" @click="${this._closeSidebar}"></div>
48
-
73
+ let e = !this.sidebarCollapsed, n = this._isMobile ? {} : { width: this.sidebarCollapsed ? this.collapsedWidth : this.sidebarWidth }, r = e ? "折叠侧边栏" : "展开侧边栏", i = s`
49
74
  <web-ui-button
50
- class="mobile-toggle"
75
+ class="sidebar-toggle"
51
76
  icon
52
- variant="glass"
77
+ variant="secondary"
53
78
  @click="${this._toggleSidebar}"
54
- aria-label="打开导航菜单"
79
+ aria-label="${r}"
55
80
  >
56
81
  <web-ui-icon .icon=${t}></web-ui-icon>
57
82
  </web-ui-button>
83
+ `, a = s`
84
+ <div class="sidebar-viewport">
85
+ <slot name="sidebar"></slot>
86
+ </div>
87
+ `, o = s`
88
+ <div class="layout-body">
89
+ <div class="sidebar-wrapper">
90
+ <aside
91
+ class="${f({ collapsed: !e })}"
92
+ style="${p(n)}"
93
+ >
94
+ <div class="aside-panel wui-glass">
95
+ ${a}
96
+ <div class="sidebar-toggle-area">${i}</div>
97
+ </div>
98
+ </aside>
99
+ </div>
100
+ <div class="layout-content">
101
+ <header>
102
+ <slot name="header"></slot>
103
+ </header>
104
+ <main><slot></slot></main>
105
+ <footer><slot name="tabbar"></slot></footer>
106
+ </div>
107
+ </div>
108
+ `, c = s`
109
+ <div class="layout-content">
110
+ <header>
111
+ <web-ui-button
112
+ class="mobile-toggle"
113
+ icon
114
+ variant="secondary"
115
+ @click="${this._toggleSidebar}"
116
+ aria-label="打开导航菜单"
117
+ >
118
+ <web-ui-icon .icon=${t}></web-ui-icon>
119
+ </web-ui-button>
120
+ <slot name="header"></slot>
121
+ </header>
122
+ <main><slot></slot></main>
123
+ <footer><slot name="tabbar"></slot></footer>
124
+ </div>
125
+
126
+ <web-ui-drawer
127
+ placement="left"
128
+ ?open="${this.sidebarOpen}"
129
+ request-only
130
+ dialog-label="主导航"
131
+ @open-change="${this._onDrawerChange}"
132
+ style="${p({ "--wui-layout-mobile-sidebar-width": this.sidebarWidth })}"
133
+ headless
134
+ >
135
+ <div class="aside-panel wui-glass mobile-sidebar">${a}</div>
136
+ </web-ui-drawer>
137
+ `;
138
+ return s`
139
+ <div class="layout-page">
140
+ <div class="layout-banner">
141
+ <slot name="banner" @slotchange="${this._onBannerSlotChange}"></slot>
142
+ </div>
143
+ ${this._isMobile ? c : o}
144
+ </div>
58
145
  `;
59
146
  }
60
147
  };
61
- e([c()], u.prototype, "_sidebarOpen", void 0), u = e([s("web-ui-layout")], u);
148
+ e([u({
149
+ type: Boolean,
150
+ attribute: "sidebar-collapsed",
151
+ reflect: !0
152
+ })], m.prototype, "sidebarCollapsed", void 0), e([u({
153
+ type: String,
154
+ attribute: "sidebar-width",
155
+ reflect: !0
156
+ })], m.prototype, "sidebarWidth", void 0), e([u({
157
+ type: String,
158
+ attribute: "collapsed-width",
159
+ reflect: !0
160
+ })], m.prototype, "collapsedWidth", void 0), e([u({
161
+ type: Boolean,
162
+ attribute: "sidebar-open",
163
+ reflect: !0
164
+ })], m.prototype, "sidebarOpen", void 0), e([u({
165
+ type: Boolean,
166
+ attribute: "header-glow",
167
+ reflect: !0
168
+ })], m.prototype, "headerGlow", void 0), e([d()], m.prototype, "_isMobile", void 0), m = e([l("web-ui-layout")], m);
62
169
  //#endregion
63
- export { u as WebUiLayout };
170
+ export { m as WebUiLayout };
64
171
 
65
172
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/layout/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\n\nimport glass from '@/assets/glass.css?inline'\nimport '@/components/icon'\nimport '@/components/button'\nimport { radixIconsPanelLeftMinimized } from '@/icons'\n\nimport style from './style.css?inline'\n\n@customElement('web-ui-layout')\nexport class WebUiLayout extends LitElement {\n static override styles = [unsafeCSS(glass), unsafeCSS(style)]\n\n @state() private _sidebarOpen = false\n\n private _toggleSidebar() {\n this._sidebarOpen = !this._sidebarOpen\n }\n\n private _closeSidebar() {\n this._sidebarOpen = false\n }\n\n private _onSidebarClick(e: MouseEvent) {\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"button\"]')) {\n this._closeSidebar()\n }\n }\n\n override render() {\n return html`\n <div class=\"layout-grid\">\n <header>\n <slot name=\"header\"></slot>\n </header>\n <main>\n <slot></slot>\n </main>\n <aside class=\"${classMap({ open: this._sidebarOpen })}\" @click=\"${this._onSidebarClick}\">\n <div class=\"menu wui-glass\"><slot name=\"sidebar\"></slot></div>\n </aside>\n <footer>\n <slot name=\"tabbar\"></slot>\n </footer>\n </div>\n\n <div class=\"${classMap({ backdrop: true, open: this._sidebarOpen })}\" @click=\"${this._closeSidebar}\"></div>\n\n <web-ui-button\n class=\"mobile-toggle\"\n icon\n variant=\"glass\"\n @click=\"${this._toggleSidebar}\"\n aria-label=\"打开导航菜单\"\n >\n <web-ui-icon .icon=${radixIconsPanelLeftMinimized}></web-ui-icon>\n </web-ui-button>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-layout': WebUiLayout\n }\n}\n"],"mappings":";;;;;;;;;;AAYO,IAAM,IAAN,cAA0B,EAAW;;EAGV,aAAA,KAAA,eAAA;;;EAFP,KAAA,SAAA,CAAC,EAAU,CAAK,GAAG,EAAU,CAAK,CAAC;;CAI5D,iBAAyB;EACvB,KAAK,eAAe,CAAC,KAAK;CAC5B;CAEA,gBAAwB;EACtB,KAAK,eAAe;CACtB;CAEA,gBAAwB,GAAe;EAErC,AADe,EAAE,OACN,QAAQ,8BAA4B,KAC7C,KAAK,cAAc;CAEvB;CAEA,SAAkB;EAChB,OAAO,CAAI;;;;;;;;wBAQS,EAAS,EAAE,MAAM,KAAK,aAAa,CAAC,EAAE,YAAY,KAAK,gBAAgB;;;;;;;;oBAQ3E,EAAS;GAAE,UAAU;GAAM,MAAM,KAAK;EAAa,CAAC,EAAE,YAAY,KAAK,cAAc;;;;;;kBAMvF,KAAK,eAAe;;;6BAGT,EAA6B;;;CAGxD;AACF;AA/CG,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,gBAAA,KAAA,CAAA,GAJR,IAAA,EAAA,CAAA,EAAc,eAAe,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/layout/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { styleMap } from 'lit/directives/style-map.js'\n\nimport glass from '@/assets/glass.css?inline'\nimport '@/components/icon'\nimport '@/components/button'\nimport '@/components/drawer'\nimport { radixIconsPanelLeftMinimized } from '@/icons'\nimport { defineVisibleAreaTracker, VisibleAreaController } from '@/shared/visible-area'\n\nimport style from './style.css?inline'\n\n/**\n * Layout 组件 - 提供页面布局框架,支持可折叠侧边栏\n *\n * @fires sidebar-collapsed-change - 桌面端侧边栏折叠状态变更请求时触发\n * @fires sidebar-open-change - 移动端侧边栏 Drawer 开关请求时触发\n * @slot banner - 顶部 Banner 区域(全宽,随页面滚动,可选)\n * @slot header - 内容区顶部 header(sticky)\n * @slot sidebar - 侧边栏内容;Consumer 决定其内部固定区域与滚动容器\n * @slot tabbar - 底部 tabbar 区域\n * @slot default - 主内容区\n */\n@customElement('web-ui-layout')\nexport class WebUiLayout extends LitElement {\n static override styles = [unsafeCSS(glass), unsafeCSS(style)]\n\n /**\n * 桌面端 Sidebar 的持久布局偏好。\n *\n * `true` 只会将桌面 Sidebar 收窄到 `collapsedWidth`,不会影响移动端 Drawer。\n * 它不与 `sidebarOpen` 合并:前者是跨视口保留的密度选择,后者是移动端瞬时的 modal 可见性。\n */\n @property({ type: Boolean, attribute: 'sidebar-collapsed', reflect: true })\n sidebarCollapsed = false\n\n @property({ type: String, attribute: 'sidebar-width', reflect: true })\n sidebarWidth = '240px'\n\n @property({ type: String, attribute: 'collapsed-width', reflect: true })\n collapsedWidth = '72px'\n\n /**\n * 移动端 headless Drawer 的瞬时可见性。\n *\n * Drawer Toggle、Escape 和遮罩关闭都通过 `sidebar-open-change` 请求更新它;它不会改变桌面端的折叠偏好。\n * 因而不与 `sidebarCollapsed` 合并,避免响应式切换时将一次移动端交互误写为桌面端布局选择。\n */\n @property({ type: Boolean, attribute: 'sidebar-open', reflect: true })\n sidebarOpen = false\n\n /**\n * 启用 header 晕染效果\n */\n @property({ type: Boolean, attribute: 'header-glow', reflect: true })\n headerGlow = false\n\n @state() private _isMobile = false\n\n private readonly _visibleBanner = defineVisibleAreaTracker({\n onVisibleAreaChange: area => {\n this.style.setProperty('--wui-layout-visible-banner-height', `${area.height}px`)\n }\n }).make()\n\n private readonly _visibleBannerController = new VisibleAreaController(this, this._visibleBanner)\n\n private _toggleSidebar() {\n if (this._isMobile) {\n this._emitSidebarOpenChange(!this.sidebarOpen)\n return\n }\n\n this._emitSidebarCollapsedChange(!this.sidebarCollapsed)\n }\n\n private _emitSidebarCollapsedChange(collapsed: boolean) {\n this.dispatchEvent(\n new CustomEvent('sidebar-collapsed-change', {\n detail: { collapsed },\n bubbles: true,\n composed: true\n })\n )\n }\n\n private _emitSidebarOpenChange(open: boolean) {\n this.dispatchEvent(\n new CustomEvent('sidebar-open-change', {\n detail: { open },\n bubbles: true,\n composed: true\n })\n )\n }\n\n private _onDrawerChange(e: CustomEvent<{ open: boolean }>) {\n e.stopPropagation()\n this._emitSidebarOpenChange(e.detail.open)\n }\n\n private _checkMobile() {\n this._isMobile = window.innerWidth <= 640\n }\n\n private _resizeTimeout: ReturnType<typeof setTimeout> | null = null\n\n private _handleResize = () => {\n if (this._resizeTimeout !== null) clearTimeout(this._resizeTimeout)\n this._resizeTimeout = setTimeout(() => {\n this._checkMobile()\n this._resizeTimeout = null\n }, 100)\n }\n\n override connectedCallback() {\n super.connectedCallback()\n this._checkMobile()\n window.addEventListener('resize', this._handleResize)\n void this.updateComplete.then(() => {\n if (this.isConnected) this._syncBannerPresence()\n })\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback()\n window.removeEventListener('resize', this._handleResize)\n if (this._resizeTimeout !== null) clearTimeout(this._resizeTimeout)\n this._resizeTimeout = null\n }\n\n override firstUpdated() {\n this._syncBannerPresence()\n }\n\n private _onBannerSlotChange() {\n this._syncBannerPresence()\n }\n\n private _syncBannerPresence() {\n const bannerSlot = this.renderRoot.querySelector<HTMLSlotElement>('slot[name=\"banner\"]')\n const hasBanner =\n bannerSlot\n ?.assignedNodes()\n .some(\n node =>\n node.nodeType === Node.ELEMENT_NODE || (node.nodeType === Node.TEXT_NODE && !!node.textContent?.trim())\n ) ?? false\n const banner = this.shadowRoot?.querySelector<HTMLElement>('.layout-banner') ?? null\n this._visibleBanner.setTarget(hasBanner ? banner : null)\n }\n\n override render() {\n const isSidebarOpen = !this.sidebarCollapsed\n const sidebarStyle = this._isMobile\n ? {}\n : { width: this.sidebarCollapsed ? this.collapsedWidth : this.sidebarWidth }\n\n const toggleLabel = isSidebarOpen ? '折叠侧边栏' : '展开侧边栏'\n\n const desktopToggle = html`\n <web-ui-button\n class=\"sidebar-toggle\"\n icon\n variant=\"secondary\"\n @click=\"${this._toggleSidebar}\"\n aria-label=\"${toggleLabel}\"\n >\n <web-ui-icon .icon=${radixIconsPanelLeftMinimized}></web-ui-icon>\n </web-ui-button>\n `\n\n const sidebarViewport = html`\n <div class=\"sidebar-viewport\">\n <slot name=\"sidebar\"></slot>\n </div>\n `\n\n // 桌面端布局\n const desktopLayout = html`\n <div class=\"layout-body\">\n <div class=\"sidebar-wrapper\">\n <aside\n class=\"${classMap({\n collapsed: !isSidebarOpen\n })}\"\n style=\"${styleMap(sidebarStyle)}\"\n >\n <div class=\"aside-panel wui-glass\">\n ${sidebarViewport}\n <div class=\"sidebar-toggle-area\">${desktopToggle}</div>\n </div>\n </aside>\n </div>\n <div class=\"layout-content\">\n <header>\n <slot name=\"header\"></slot>\n </header>\n <main><slot></slot></main>\n <footer><slot name=\"tabbar\"></slot></footer>\n </div>\n </div>\n `\n\n // 移动端布局\n const mobileLayout = html`\n <div class=\"layout-content\">\n <header>\n <web-ui-button\n class=\"mobile-toggle\"\n icon\n variant=\"secondary\"\n @click=\"${this._toggleSidebar}\"\n aria-label=\"打开导航菜单\"\n >\n <web-ui-icon .icon=${radixIconsPanelLeftMinimized}></web-ui-icon>\n </web-ui-button>\n <slot name=\"header\"></slot>\n </header>\n <main><slot></slot></main>\n <footer><slot name=\"tabbar\"></slot></footer>\n </div>\n\n <web-ui-drawer\n placement=\"left\"\n ?open=\"${this.sidebarOpen}\"\n request-only\n dialog-label=\"主导航\"\n @open-change=\"${this._onDrawerChange}\"\n style=\"${styleMap({ '--wui-layout-mobile-sidebar-width': this.sidebarWidth })}\"\n headless\n >\n <div class=\"aside-panel wui-glass mobile-sidebar\">${sidebarViewport}</div>\n </web-ui-drawer>\n `\n\n return html`\n <div class=\"layout-page\">\n <div class=\"layout-banner\">\n <slot name=\"banner\" @slotchange=\"${this._onBannerSlotChange}\"></slot>\n </div>\n ${this._isMobile ? mobileLayout : desktopLayout}\n </div>\n `\n }\n\n declare readonly $events: {\n 'sidebar-collapsed-change': CustomEvent<{ collapsed: boolean }>\n 'sidebar-open-change': CustomEvent<{ open: boolean }>\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-layout': WebUiLayout\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  //#region src/components/layout/style.css?inline
2
- var e = "*,:before,:after{box-sizing:border-box}:host{display:block}.layout-grid{grid-template-areas:\"sidebar header\"\"sidebar content\";grid-template-columns:var(--web-ui-base-layout-sidebar-width,240px) 1fr;grid-template-rows:var(--web-ui-base-layout-header-height,64px) 1fr;box-sizing:border-box;min-height:100vh;display:grid}.layout-grid *{box-sizing:inherit}header{z-index:var(--wui-layer-header,10);grid-area:header;position:sticky;top:0;right:0}main{grid-area:content}aside{grid-area:sidebar;height:100vh;padding:8px;position:sticky;top:0;left:0}aside .menu{background-color:var(--wui-color-surface-overlay,#f6f6f6e0);border-radius:24px;height:100%}footer{grid-area:footer}.backdrop{display:none}.mobile-toggle{z-index:var(--wui-layer-header,20);visibility:hidden;position:fixed;top:12px;left:12px}@media (width<=640px){.layout-grid{grid-template-columns:1fr;grid-template-areas:\"header\"\"content\"}aside{z-index:var(--wui-layer-drawer,100);width:var(--web-ui-base-layout-sidebar-width,240px);height:100dvh;transition:transform var(--wui-duration-drawer-enter,.28s) ease;padding:8px;position:fixed;top:0;left:0;transform:translate(-100%)}aside.open{transform:translate(0)}.backdrop{z-index:var(--wui-layer-backdrop,90);background:#0000004d;display:none;position:fixed;inset:0}.backdrop.open{display:block}.mobile-toggle{visibility:visible}}";
2
+ var e = "*,:before,:after{box-sizing:border-box}:host{--wui-layout-visible-banner-height:0px;--wui-layout-header-glow-color:var(--wui-color-page,#fff);--wui-internal-layout-header-glow-height:150%;display:block}.layout-page{flex-direction:column;min-height:100dvh;display:flex}.layout-banner{z-index:var(--wui-layer-banner,30);position:relative}.layout-body{flex:1;display:flex}.sidebar-wrapper{align-self:stretch;position:relative}.sidebar-viewport{flex:1;min-height:0}.mobile-sidebar{width:calc(var(--wui-layout-mobile-sidebar-width,240px) - 16px);border-radius:var(--wui-layout-sidebar-radius,28px);background-color:var(--wui-color-surface-overlay,#f6f6f6d1);flex-direction:column;max-width:calc(100vw - 16px);height:calc(100dvh - 16px);min-height:0;margin:8px;display:flex}aside{z-index:var(--wui-layer-sidebar,50);height:calc(100vh - var(--wui-layout-visible-banner-height));height:calc(100dvh - var(--wui-layout-visible-banner-height));max-height:calc(100vh - var(--wui-layout-visible-banner-height));max-height:calc(100dvh - var(--wui-layout-visible-banner-height));transition:width var(--wui-duration-layout,.2s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1));flex-direction:column;flex-shrink:0;padding:8px;display:flex;position:sticky;top:0}aside .aside-panel{border-radius:var(--wui-layout-sidebar-radius,28px);background-color:var(--wui-color-surface-overlay,#f6f6f6d1);flex-direction:column;flex:1;min-height:0;display:flex}aside .sidebar-toggle-area{flex-shrink:0;align-items:center;display:flex}aside .sidebar-toggle{width:fit-content;margin:8px}aside.collapsed .sidebar-viewport{overflow:hidden}.layout-content{flex-direction:column;flex:1;min-width:0;display:flex}header{isolation:isolate;z-index:var(--wui-layer-header,10);align-items:center;gap:8px;display:flex;position:sticky;top:0}:host([header-glow]) header:before{pointer-events:none;content:\"\";z-index:-1;inset:calc(100% - var(--wui-internal-layout-header-glow-height)) -20px auto;height:var(--wui-internal-layout-header-glow-height);background:linear-gradient(to bottom, var(--wui-layout-header-glow-color) 0%, var(--wui-layout-header-glow-color) 55%, color-mix(in srgb, var(--wui-layout-header-glow-color) 90%, transparent) 62%, color-mix(in srgb, var(--wui-layout-header-glow-color) 40%, transparent) 70%, transparent 100%);filter:blur(10px);position:absolute;transform:scaleY(1.5)}main{flex:1}footer{z-index:var(--wui-layer-tabbar,40);position:sticky;bottom:0}@media (width<=640px){aside,.sidebar-wrapper{display:none}}@media (prefers-reduced-motion:reduce){aside{transition:none}}";
3
3
  //#endregion
4
4
  export { e as default };
5
5