@featherk/ui 0.12.5 → 0.13.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.
@@ -1,7 +1,7 @@
1
1
  // Generated by scripts/generate-docs-manifest.mjs. Do not edit.
2
2
  export const packageName = "@featherk/ui";
3
3
 
4
- export const version = "0.12.5";
4
+ export const version = "0.13.0";
5
5
 
6
6
  export const paths = {
7
7
  ActionCell: "table/ActionCell.md",
@@ -10,9 +10,9 @@ export const paths = {
10
10
  };
11
11
 
12
12
  export const docs = {
13
- ActionCell: "https://cdn.jsdelivr.net/npm/@featherk/ui@0.12.5/docs/table/ActionCell.md",
14
- USAddress: "https://cdn.jsdelivr.net/npm/@featherk/ui@0.12.5/docs/address/USAddress.md",
15
- useActionCellMenu: "https://cdn.jsdelivr.net/npm/@featherk/ui@0.12.5/docs/table/useActionCellMenu.md",
13
+ ActionCell: "https://cdn.jsdelivr.net/npm/@featherk/ui@0.13.0/docs/table/ActionCell.md",
14
+ USAddress: "https://cdn.jsdelivr.net/npm/@featherk/ui@0.13.0/docs/address/USAddress.md",
15
+ useActionCellMenu: "https://cdn.jsdelivr.net/npm/@featherk/ui@0.13.0/docs/table/useActionCellMenu.md",
16
16
  };
17
17
 
18
18
  export const docUrl = (name, host = "https://cdn.jsdelivr.net/npm") =>
@@ -1,17 +1,17 @@
1
1
  import "./ui.css";
2
- import { defineComponent as F, computed as i, openBlock as c, createElementBlock as w, normalizeClass as O, createElementVNode as V, createVNode as E, unref as v, Fragment as $, createBlock as h, withCtx as I, createTextVNode as S, toDisplayString as k, createCommentVNode as A, normalizeStyle as U, renderList as H, toValue as W } from "vue";
2
+ import { defineComponent as F, computed as i, openBlock as c, createElementBlock as w, normalizeClass as O, createElementVNode as V, createVNode as E, unref as v, Fragment as $, createBlock as h, withCtx as I, createTextVNode as S, toDisplayString as k, createCommentVNode as A, normalizeStyle as U, renderList as H, toValue as W, nextTick as J } from "vue";
3
3
  import { Error as D, Hint as b } from "@progress/kendo-vue-labels";
4
- import { TextBox as T } from "@progress/kendo-vue-inputs";
5
- import { DropDownList as J } from "@progress/kendo-vue-dropdowns";
6
- import { Button as Q } from "@progress/kendo-vue-buttons";
7
- import { useCompositeId as X, useActiveIdRegistry as Y, usePopupMenu as ee } from "@featherk/composables";
8
- const ae = { class: "address1" }, le = {
4
+ import { TextBox as M } from "@progress/kendo-vue-inputs";
5
+ import { DropDownList as Q } from "@progress/kendo-vue-dropdowns";
6
+ import { Button as X } from "@progress/kendo-vue-buttons";
7
+ import { useCompositeId as Y, useActiveIdRegistry as ee, usePopupMenu as ae } from "@featherk/composables";
8
+ const le = { class: "address1" }, te = {
9
9
  key: 0,
10
10
  class: "address2"
11
- }, te = { class: "city" }, re = { class: "state" }, ie = { class: "zip" }, de = {
11
+ }, re = { class: "city" }, ie = { class: "state" }, de = { class: "zip" }, se = {
12
12
  key: 1,
13
13
  class: "messages"
14
- }, q = "Enter a 5 or 9 digit zip code.", se = "Incomplete address.", ne = /* @__PURE__ */ F({
14
+ }, x = "Enter a 5 or 9 digit zip code.", ne = "Incomplete address.", oe = /* @__PURE__ */ F({
15
15
  __name: "USAddress",
16
16
  props: {
17
17
  id: {},
@@ -21,8 +21,8 @@ const ae = { class: "address1" }, le = {
21
21
  messages: {},
22
22
  showAddress2: { type: Boolean, default: !0 }
23
23
  },
24
- setup(n) {
25
- const a = n, d = {
24
+ setup(o) {
25
+ const a = o, s = {
26
26
  placeholder: {
27
27
  address1: "Address Line 1",
28
28
  address2: "Address Line 2",
@@ -32,7 +32,7 @@ const ae = { class: "address1" }, le = {
32
32
  fieldset: {
33
33
  error: {
34
34
  required: "Required fields are missing.",
35
- zip: q
35
+ zip: x
36
36
  },
37
37
  hint: {
38
38
  address: "Enter address information."
@@ -44,98 +44,98 @@ const ae = { class: "address1" }, le = {
44
44
  address2: "",
45
45
  city: "Required",
46
46
  state: "Required",
47
- zip: q
47
+ zip: x
48
48
  },
49
49
  hint: {
50
50
  address1: "Enter address line 1.",
51
51
  address2: "Optional",
52
52
  city: "",
53
53
  state: "",
54
- zip: q
54
+ zip: x
55
55
  }
56
56
  }
57
- }, m = (r) => ({
57
+ }, y = (r) => ({
58
58
  placeholder: {
59
- address1: r?.placeholder?.address1 ?? d.placeholder.address1,
60
- address2: r?.placeholder?.address2 ?? d.placeholder.address2,
61
- city: r?.placeholder?.city ?? d.placeholder.city,
62
- zip: r?.placeholder?.zip ?? d.placeholder.zip
59
+ address1: r?.placeholder?.address1 ?? s.placeholder.address1,
60
+ address2: r?.placeholder?.address2 ?? s.placeholder.address2,
61
+ city: r?.placeholder?.city ?? s.placeholder.city,
62
+ zip: r?.placeholder?.zip ?? s.placeholder.zip
63
63
  },
64
64
  fieldset: {
65
65
  error: {
66
- required: r?.fieldset?.error?.required ?? d.fieldset.error.required,
67
- zip: r?.fieldset?.error?.zip ?? d.fieldset.error.zip
66
+ required: r?.fieldset?.error?.required ?? s.fieldset.error.required,
67
+ zip: r?.fieldset?.error?.zip ?? s.fieldset.error.zip
68
68
  },
69
69
  hint: {
70
- address: r?.fieldset?.hint?.address ?? d.fieldset.hint.address
70
+ address: r?.fieldset?.hint?.address ?? s.fieldset.hint.address
71
71
  }
72
72
  },
73
73
  field: {
74
74
  error: {
75
- address1: r?.field?.error?.address1 ?? d.field.error.address1,
76
- address2: r?.field?.error?.address2 ?? d.field.error.address2,
77
- city: r?.field?.error?.city ?? d.field.error.city,
78
- state: r?.field?.error?.state ?? d.field.error.state,
79
- zip: r?.field?.error?.zip ?? d.field.error.zip
75
+ address1: r?.field?.error?.address1 ?? s.field.error.address1,
76
+ address2: r?.field?.error?.address2 ?? s.field.error.address2,
77
+ city: r?.field?.error?.city ?? s.field.error.city,
78
+ state: r?.field?.error?.state ?? s.field.error.state,
79
+ zip: r?.field?.error?.zip ?? s.field.error.zip
80
80
  },
81
81
  hint: {
82
- address1: r?.field?.hint?.address1 ?? d.field.hint.address1,
83
- address2: r?.field?.hint?.address2 ?? d.field.hint.address2,
84
- city: r?.field?.hint?.city ?? d.field.hint.city,
85
- state: r?.field?.hint?.state ?? d.field.hint.state,
86
- zip: r?.field?.hint?.zip ?? d.field.hint.zip
82
+ address1: r?.field?.hint?.address1 ?? s.field.hint.address1,
83
+ address2: r?.field?.hint?.address2 ?? s.field.hint.address2,
84
+ city: r?.field?.hint?.city ?? s.field.hint.city,
85
+ state: r?.field?.hint?.state ?? s.field.hint.state,
86
+ zip: r?.field?.hint?.zip ?? s.field.hint.zip
87
87
  }
88
88
  }
89
- }), s = i(() => m(a.messages)), f = i(() => a.messageScope === "field"), C = i(() => a.messageScope === "fieldset"), u = i(() => a.required), g = i(() => u.value), l = i(() => ({
89
+ }), n = i(() => y(a.messages)), f = i(() => a.messageScope === "field"), z = i(() => a.messageScope === "fieldset"), u = i(() => a.required), m = i(() => u.value), l = i(() => ({
90
90
  address1: `${a.id}-address1`,
91
91
  address2: `${a.id}-address2`,
92
92
  city: `${a.id}-city`,
93
93
  state: `${a.id}-state`,
94
94
  zip: `${a.id}-zip`
95
- })), e = i(() => a.address), p = i(() => e.value.address1Valid.value && e.value.cityValid.value && e.value.stateValid.value), z = i(() => e.value.formData.address1.trim() !== "" || e.value.formData.address2.trim() !== "" || e.value.formData.city.trim() !== "" || (e.value.formData.state ?? "").trim() !== "" || e.value.formData.zip.replace(/\D/g, "") !== ""), t = i(() => {
95
+ })), e = i(() => a.address), p = i(() => e.value.address1Valid.value && e.value.cityValid.value && e.value.stateValid.value), C = i(() => e.value.formData.address1.trim() !== "" || e.value.formData.address2.trim() !== "" || e.value.formData.city.trim() !== "" || (e.value.formData.state ?? "").trim() !== "" || e.value.formData.zip.replace(/\D/g, "") !== ""), T = i(() => {
96
96
  if (e.value.optionalZipInvalid)
97
97
  return e.value.optionalZipInvalid.value;
98
98
  const r = e.value.formData.zip.replace(/\D/g, "");
99
- return !u.value && z.value && r.length !== 5 && r.length !== 9;
100
- }), o = i(() => e.value.optionalPartialInvalid ? e.value.optionalPartialInvalid.value : !u.value && z.value && !e.value.addressValid.value), y = i(() => u.value || !o.value ? !1 : e.value.optionalFeedbackActive ? e.value.optionalFeedbackActive.value : !1), P = i(() => g.value && !e.value.address1Valid.value || y.value && e.value.formData.address1.trim() === ""), R = i(() => g.value && !e.value.cityValid.value || y.value && e.value.formData.city.trim() === ""), x = i(() => g.value && !e.value.stateValid.value || y.value && (e.value.formData.state ?? "").trim() === ""), M = i(() => g.value && !e.value.zipValid.value || y.value && t.value), _ = i(() => u.value ? e.value.addressValidate.value : y.value), B = i(() => u.value ? e.value.address1Valid.value : !P.value), K = i(() => u.value ? e.value.cityValid.value : !R.value), L = i(() => u.value ? e.value.stateValid.value : !x.value), N = i(() => u.value ? e.value.zipValid.value : !M.value), Z = i(() => {
101
- const r = s.value.placeholder.address2;
102
- return C.value && u.value ? `${r} (Optional)` : r;
99
+ return !u.value && C.value && r.length !== 5 && r.length !== 9;
100
+ }), t = i(() => e.value.optionalPartialInvalid ? e.value.optionalPartialInvalid.value : !u.value && C.value && !e.value.addressValid.value), d = i(() => u.value || !t.value ? !1 : e.value.optionalFeedbackActive ? e.value.optionalFeedbackActive.value : !1), g = i(() => m.value && !e.value.address1Valid.value || d.value && e.value.formData.address1.trim() === ""), P = i(() => m.value && !e.value.cityValid.value || d.value && e.value.formData.city.trim() === ""), R = i(() => m.value && !e.value.stateValid.value || d.value && (e.value.formData.state ?? "").trim() === ""), q = i(() => m.value && !e.value.zipValid.value || d.value && T.value), _ = i(() => u.value ? e.value.addressValidate.value : d.value), K = i(() => u.value ? e.value.address1Valid.value : !g.value), L = i(() => u.value ? e.value.cityValid.value : !P.value), B = i(() => u.value ? e.value.stateValid.value : !R.value), N = i(() => u.value ? e.value.zipValid.value : !q.value), Z = i(() => {
101
+ const r = n.value.placeholder.address2;
102
+ return z.value && u.value ? `${r} (Optional)` : r;
103
103
  }), j = i(() => {
104
104
  const r = [];
105
- return p.value || r.push(s.value.fieldset.error.required), e.value.zipValid.value || r.push(s.value.fieldset.error.zip), r.join(" ");
105
+ return p.value || r.push(n.value.fieldset.error.required), e.value.zipValid.value || r.push(n.value.fieldset.error.zip), r.join(" ");
106
106
  }), G = i(() => {
107
- const r = [se];
108
- return t.value && r.push(s.value.fieldset.error.zip), r.join(" ");
107
+ const r = [ne];
108
+ return T.value && r.push(n.value.fieldset.error.zip), r.join(" ");
109
109
  });
110
- return (r, ve) => (c(), w("div", {
111
- class: O(["fkui-us-address", { "fkui-us-address--fieldset-scope": C.value }])
110
+ return (r, ce) => (c(), w("div", {
111
+ class: O(["fkui-us-address", { "fkui-us-address--fieldset-scope": z.value }])
112
112
  }, [
113
- V("div", ae, [
114
- E(v(T), {
113
+ V("div", le, [
114
+ E(v(M), {
115
115
  id: l.value.address1,
116
- placeholder: s.value.placeholder.address1,
116
+ placeholder: n.value.placeholder.address1,
117
117
  value: e.value.formData.address1,
118
- valid: B.value,
118
+ valid: K.value,
119
119
  validate: _.value,
120
120
  validityStyles: _.value,
121
121
  onInput: e.value.onAddress1Input
122
122
  }, null, 8, ["id", "placeholder", "value", "valid", "validate", "validityStyles", "onInput"]),
123
123
  f.value ? (c(), w($, { key: 0 }, [
124
- P.value ? (c(), h(v(D), { key: 0 }, {
124
+ g.value ? (c(), h(v(D), { key: 0 }, {
125
125
  default: I(() => [
126
- S(k(s.value.field.error.address1), 1)
126
+ S(k(n.value.field.error.address1), 1)
127
127
  ]),
128
128
  _: 1
129
129
  })) : (c(), h(v(b), { key: 1 }, {
130
130
  default: I(() => [
131
- S(k(s.value.field.hint.address1), 1)
131
+ S(k(n.value.field.hint.address1), 1)
132
132
  ]),
133
133
  _: 1
134
134
  }))
135
135
  ], 64)) : A("", !0)
136
136
  ]),
137
- r.showAddress2 ? (c(), w("div", le, [
138
- E(v(T), {
137
+ r.showAddress2 ? (c(), w("div", te, [
138
+ E(v(M), {
139
139
  id: l.value.address2,
140
140
  placeholder: Z.value,
141
141
  value: e.value.formData.address2,
@@ -143,30 +143,30 @@ const ae = { class: "address1" }, le = {
143
143
  }, null, 8, ["id", "placeholder", "value", "onInput"]),
144
144
  f.value ? (c(), h(v(b), { key: 0 }, {
145
145
  default: I(() => [
146
- S(k(s.value.field.hint.address2), 1)
146
+ S(k(n.value.field.hint.address2), 1)
147
147
  ]),
148
148
  _: 1
149
149
  })) : A("", !0)
150
150
  ])) : A("", !0),
151
- V("div", te, [
152
- E(v(T), {
151
+ V("div", re, [
152
+ E(v(M), {
153
153
  id: l.value.city,
154
- placeholder: s.value.placeholder.city,
154
+ placeholder: n.value.placeholder.city,
155
155
  value: e.value.formData.city,
156
- valid: K.value,
156
+ valid: L.value,
157
157
  validate: _.value,
158
158
  validityStyles: _.value,
159
159
  onInput: e.value.onCityInput
160
160
  }, null, 8, ["id", "placeholder", "value", "valid", "validate", "validityStyles", "onInput"]),
161
- f.value && R.value ? (c(), h(v(D), { key: 0 }, {
161
+ f.value && P.value ? (c(), h(v(D), { key: 0 }, {
162
162
  default: I(() => [
163
- S(k(s.value.field.error.city), 1)
163
+ S(k(n.value.field.error.city), 1)
164
164
  ]),
165
165
  _: 1
166
166
  })) : A("", !0)
167
167
  ]),
168
- V("div", re, [
169
- E(v(J), {
168
+ V("div", ie, [
169
+ E(v(Q), {
170
170
  id: l.value.state,
171
171
  value: e.value.formData.state,
172
172
  onChange: e.value.onStateChange,
@@ -176,21 +176,21 @@ const ae = { class: "address1" }, le = {
176
176
  valueField: "value",
177
177
  dataItemKey: "value",
178
178
  valuePrimitive: !0,
179
- valid: L.value,
179
+ valid: B.value,
180
180
  validate: _.value,
181
181
  validityStyles: _.value
182
182
  }, null, 8, ["id", "value", "onChange", "defaultItem", "dataItems", "valid", "validate", "validityStyles"]),
183
- f.value && x.value ? (c(), h(v(D), { key: 0 }, {
183
+ f.value && R.value ? (c(), h(v(D), { key: 0 }, {
184
184
  default: I(() => [
185
- S(k(s.value.field.error.state), 1)
185
+ S(k(n.value.field.error.state), 1)
186
186
  ]),
187
187
  _: 1
188
188
  })) : A("", !0)
189
189
  ]),
190
- V("div", ie, [
191
- E(v(T), {
190
+ V("div", de, [
191
+ E(v(M), {
192
192
  id: l.value.zip,
193
- placeholder: s.value.placeholder.zip,
193
+ placeholder: n.value.placeholder.zip,
194
194
  wrapperClass: e.value.zipWrapperClass,
195
195
  value: e.value.zipDisplay.value,
196
196
  onInput: e.value.onZipInput,
@@ -199,45 +199,45 @@ const ae = { class: "address1" }, le = {
199
199
  validityStyles: _.value,
200
200
  style: { width: "100%" }
201
201
  }, null, 8, ["id", "placeholder", "wrapperClass", "value", "onInput", "valid", "validate", "validityStyles"]),
202
- f.value && M.value ? (c(), h(v(D), { key: 0 }, {
202
+ f.value && q.value ? (c(), h(v(D), { key: 0 }, {
203
203
  default: I(() => [
204
- S(k(s.value.field.error.zip), 1)
204
+ S(k(n.value.field.error.zip), 1)
205
205
  ]),
206
206
  _: 1
207
207
  })) : A("", !0),
208
- f.value && !M.value ? (c(), h(v(b), { key: 1 }, {
208
+ f.value && !q.value ? (c(), h(v(b), { key: 1 }, {
209
209
  default: I(() => [
210
- S(k(s.value.field.hint.zip), 1)
210
+ S(k(n.value.field.hint.zip), 1)
211
211
  ]),
212
212
  _: 1
213
213
  })) : A("", !0)
214
214
  ]),
215
- C.value ? (c(), w("div", de, [
216
- g.value && !e.value.addressValid.value ? (c(), h(v(D), { key: 0 }, {
215
+ z.value ? (c(), w("div", se, [
216
+ m.value && !e.value.addressValid.value ? (c(), h(v(D), { key: 0 }, {
217
217
  default: I(() => [
218
218
  S(k(j.value), 1)
219
219
  ]),
220
220
  _: 1
221
- })) : y.value ? (c(), h(v(D), { key: 1 }, {
221
+ })) : d.value ? (c(), h(v(D), { key: 1 }, {
222
222
  default: I(() => [
223
223
  S(k(G.value), 1)
224
224
  ]),
225
225
  _: 1
226
226
  })) : (c(), h(v(b), { key: 2 }, {
227
227
  default: I(() => [
228
- S(k(s.value.fieldset.hint.address), 1)
228
+ S(k(n.value.fieldset.hint.address), 1)
229
229
  ]),
230
230
  _: 1
231
231
  }))
232
232
  ])) : A("", !0)
233
233
  ], 2));
234
234
  }
235
- }), oe = (n, a) => {
236
- const d = n.__vccOpts || n;
237
- for (const [m, s] of a)
238
- d[m] = s;
239
- return d;
240
- }, ge = /* @__PURE__ */ oe(ne, [["__scopeId", "data-v-8aeb035b"]]), ue = ["id", "colspan", "aria-colindex", "aria-selected", "data-grid-col-index"], Ie = /* @__PURE__ */ F({
235
+ }), ue = (o, a) => {
236
+ const s = o.__vccOpts || o;
237
+ for (const [y, n] of a)
238
+ s[y] = n;
239
+ return s;
240
+ }, Ie = /* @__PURE__ */ ue(oe, [["__scopeId", "data-v-8aeb035b"]]), ve = ["id", "colspan", "aria-colindex", "aria-selected", "data-grid-col-index"], Se = /* @__PURE__ */ F({
241
241
  inheritAttrs: !1,
242
242
  __name: "ActionCell",
243
243
  props: {
@@ -253,10 +253,10 @@ const ae = { class: "address1" }, le = {
253
253
  menuController: {},
254
254
  tabIndex: { default: -1 }
255
255
  },
256
- setup(n) {
257
- const a = n, d = X("action-cell"), m = (l) => a.menuController.getTriggerId(l, a.dataItem), s = (l) => a.menuController.registry.isIdActive(m(l)), f = (l) => typeof l.items == "function", C = (l, e) => {
256
+ setup(o) {
257
+ const a = o, s = Y("action-cell"), y = (l) => a.menuController.getTriggerId(l, a.dataItem), n = (l) => a.menuController.registry.isIdActive(y(l)), f = (l) => typeof l.items == "function", z = (l, e) => {
258
258
  a.menuController.registry.register(
259
- m(l),
259
+ y(l),
260
260
  e
261
261
  );
262
262
  }, u = (l) => {
@@ -264,12 +264,12 @@ const ae = { class: "address1" }, le = {
264
264
  a.menuController.handleDirectAction?.(l, a.dataItem);
265
265
  return;
266
266
  }
267
- a.menuController.handleTriggerClick(m(l));
268
- }, g = (l, ...e) => {
269
- f(l) && a.menuController.handleTriggerKeydown(m(l), ...e);
267
+ a.menuController.handleTriggerClick(y(l));
268
+ }, m = (l, ...e) => {
269
+ f(l) && a.menuController.handleTriggerKeydown(y(l), ...e);
270
270
  };
271
271
  return (l, e) => (c(), w("td", {
272
- id: l.id ?? v(d).instanceId,
272
+ id: l.id ?? v(s).instanceId,
273
273
  class: O(["fkui-action-cell", "k-table-td", l.className]),
274
274
  style: U(l.style),
275
275
  colspan: l.colSpan,
@@ -278,11 +278,11 @@ const ae = { class: "address1" }, le = {
278
278
  "aria-selected": l.isSelected,
279
279
  "data-grid-col-index": l.columnIndex
280
280
  }, [
281
- (c(!0), w($, null, H(l.config.triggers, (p) => (c(), h(v(Q), {
281
+ (c(!0), w($, null, H(l.config.triggers, (p) => (c(), h(v(X), {
282
282
  key: p.key,
283
283
  ref_for: !0,
284
- ref: f(p) ? (z) => C(p, z) : void 0,
285
- id: v(d).compose(p.key, "trigger"),
284
+ ref: f(p) ? (C) => z(p, C) : void 0,
285
+ id: v(s).compose(p.key, "trigger"),
286
286
  "svg-icon": p.icon,
287
287
  type: "button",
288
288
  "fill-mode": "flat",
@@ -290,71 +290,81 @@ const ae = { class: "address1" }, le = {
290
290
  rounded: "full",
291
291
  "aria-label": p.ariaLabel,
292
292
  "aria-haspopup": f(p) ? "menu" : void 0,
293
- "aria-expanded": f(p) ? s(p) : void 0,
293
+ "aria-expanded": f(p) ? n(p) : void 0,
294
294
  disabled: p.disabled?.(l.dataItem),
295
295
  tabindex: l.tabIndex,
296
- onClick: (z) => u(p),
297
- onKeydown: (z) => g(p, z)
296
+ onClick: (C) => u(p),
297
+ onKeydown: (C) => m(p, C)
298
298
  }, null, 8, ["id", "svg-icon", "aria-label", "aria-haspopup", "aria-expanded", "disabled", "tabindex", "onClick", "onKeydown"]))), 128))
299
- ], 14, ue));
299
+ ], 14, ve));
300
300
  }
301
- }), Se = (n) => {
302
- const a = Y();
303
- n.group?.register(a);
304
- const d = n.getTriggerId ?? ((t, o) => `${t.key}:${n.getRowId(o)}`), m = i(() => {
301
+ }), ke = (o) => {
302
+ const a = ee();
303
+ o.group?.register(a);
304
+ const s = o.getTriggerId ?? ((t, d) => `${t.key}:${o.getRowId(d)}`), y = i(() => {
305
305
  const t = a.activeId.value?.split(":")[0];
306
- return n.config.triggers.find((o) => o.key === t) ?? null;
307
- }), s = i(() => {
306
+ return o.config.triggers.find((d) => d.key === t) ?? null;
307
+ }), n = i(() => {
308
308
  const t = a.activeId.value?.split(":").slice(1).join(":");
309
- return t === void 0 ? null : W(n.rows).find(
310
- (o) => String(n.getRowId(o)) === t
309
+ return t === void 0 ? null : W(o.rows).find(
310
+ (d) => String(o.getRowId(d)) === t
311
311
  ) ?? null;
312
312
  }), f = i(() => {
313
- const t = s.value, o = m.value;
314
- return t && o ? o.items?.(t) ?? [] : [];
315
- }), C = i(() => {
316
- const t = s.value, o = m.value;
317
- return t && o && typeof o.items == "function" && o.title ? o.title(t) : null;
318
- }), u = ee({
313
+ const t = n.value, d = y.value;
314
+ return t && d ? d.items?.(t) ?? [] : [];
315
+ }), z = i(() => {
316
+ const t = n.value, d = y.value;
317
+ return t && d && typeof d.items == "function" && d.title ? d.title(t) : null;
318
+ }), u = ae({
319
319
  isOpen: a.isActive,
320
320
  triggerRef: a.activeElement,
321
- menuRef: n.menuRef,
322
- triggerMode: n.triggerMode ?? "button",
323
- anchor: n.anchor ?? !0,
324
- resolveFocusTarget: n.resolveFocusTarget,
321
+ menuRef: o.menuRef,
322
+ triggerMode: o.triggerMode ?? "button",
323
+ anchor: o.anchor ?? !0,
324
+ resolveFocusTarget: o.resolveFocusTarget,
325
+ focusTargetContainerSelector: o.focusTargetContainerSelector,
325
326
  requestShow: (t) => {
326
327
  typeof t == "string" && a.activate(t);
327
328
  },
328
329
  requestHide: () => a.deactivate(),
329
- menuLabel: C
330
- }), g = (t) => {
331
- a.isActive.value && !a.isIdActive(t) && a.deactivate(), n.group?.deactivateOthers(a), u.handleActionButtonClick(t);
332
- }, l = (t, o) => {
333
- n.group?.deactivateOthers(a), a.deactivate(), n.onActionSelected(void 0, o, t);
334
- }, e = (t, ...o) => {
335
- const y = o[0];
336
- if (y.key === "Enter" || y.code === "Space") {
337
- y.preventDefault(), g(t);
330
+ menuLabel: z
331
+ });
332
+ let m = 0;
333
+ const l = (t) => {
334
+ const d = ++m;
335
+ if (o.group?.deactivateOthers(a), a.isActive.value && !a.isIdActive(t)) {
336
+ a.deactivate(), J(() => {
337
+ d === m && u.handleTriggerClick(t);
338
+ });
339
+ return;
340
+ }
341
+ u.handleTriggerClick(t);
342
+ }, e = (t, d) => {
343
+ m++, o.group?.deactivateOthers(a), a.deactivate(), o.onActionSelected(void 0, d, t);
344
+ }, p = (t, ...d) => {
345
+ const g = d[0];
346
+ if (g.key === "Enter" || g.code === "Space") {
347
+ g.preventDefault(), l(t);
338
348
  return;
339
349
  }
340
- u.handleActionButtonKeydown(y, t);
341
- }, p = (t) => {
342
- t.key === "Escape" && u.handleActionMenuEscape(t);
343
- }, z = (t) => {
344
- const o = s.value, y = m.value;
350
+ u.handleTriggerKeydown(g, t);
351
+ }, C = (t) => {
352
+ t.key === "Escape" && u.handleMenuEscape(t);
353
+ }, T = (t) => {
354
+ const d = n.value, g = y.value;
345
355
  u.handleMenuSelect(t, () => {
346
- o && y && n.onActionSelected(t.item, o, y);
356
+ d && g && o.onActionSelected(t.item, d, g);
347
357
  });
348
358
  };
349
359
  return {
350
360
  actionCellProps: {
351
- config: n.config,
361
+ config: o.config,
352
362
  menuController: {
353
363
  registry: a,
354
- getTriggerId: d,
355
- handleTriggerClick: g,
356
- handleDirectAction: l,
357
- handleTriggerKeydown: e
364
+ getTriggerId: s,
365
+ handleTriggerClick: l,
366
+ handleDirectAction: e,
367
+ handleTriggerKeydown: p
358
368
  }
359
369
  },
360
370
  popupProps: i(() => ({
@@ -365,17 +375,17 @@ const ae = { class: "address1" }, le = {
365
375
  menuProps: i(() => ({
366
376
  items: f.value,
367
377
  vertical: !0,
368
- onKeydown: p,
369
- onSelect: z
378
+ onKeydown: C,
379
+ onSelect: T
370
380
  })),
371
- activeRow: s,
372
- activeTrigger: m,
373
- activeTitle: C
381
+ activeRow: n,
382
+ activeTrigger: y,
383
+ activeTitle: z
374
384
  };
375
385
  };
376
386
  export {
377
- Ie as ActionCell,
378
- ge as USAddress,
379
- Se as useActionCellMenu
387
+ Se as ActionCell,
388
+ Ie as USAddress,
389
+ ke as useActionCellMenu
380
390
  };
381
391
  //# sourceMappingURL=featherk-ui.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"featherk-ui.es.js","sources":["../src/address/USAddress.vue","../src/table/ActionCell.vue","../src/table/useActionCellMenu.ts"],"sourcesContent":["<template>\n <div\n class=\"fkui-us-address\"\n :class=\"{ 'fkui-us-address--fieldset-scope': fieldsetScope }\"\n >\n <div class=\"address1\">\n <TextBox\n :id=\"fieldIds.address1\"\n :placeholder=\"resolvedMessages.placeholder.address1\"\n :value=\"address.formData.address1\"\n :valid=\"address1DisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onAddress1Input\"\n />\n <template v-if=\"fieldScope\">\n <Error v-if=\"showAddress1Error\">\n {{ resolvedMessages.field.error.address1 }}\n </Error>\n <Hint v-else>{{ resolvedMessages.field.hint.address1 }}</Hint>\n </template>\n </div>\n\n <div v-if=\"showAddress2\" class=\"address2\">\n <TextBox\n :id=\"fieldIds.address2\"\n :placeholder=\"address2PlaceholderDisplay\"\n :value=\"address.formData.address2\"\n @input=\"address.onAddress2Input\"\n />\n <Hint v-if=\"fieldScope\">{{ resolvedMessages.field.hint.address2 }}</Hint>\n </div>\n\n <div class=\"city\">\n <TextBox\n :id=\"fieldIds.city\"\n :placeholder=\"resolvedMessages.placeholder.city\"\n :value=\"address.formData.city\"\n :valid=\"cityDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onCityInput\"\n />\n <Error v-if=\"fieldScope && showCityError\">\n {{ resolvedMessages.field.error.city }}\n </Error>\n </div>\n\n <div class=\"state\">\n <DropDownList\n :id=\"fieldIds.state\"\n :value=\"address.formData.state\"\n @change=\"address.onStateChange\"\n :defaultItem=\"address.stateDefaultItem\"\n :dataItems=\"address.stateOptions\"\n textField=\"label\"\n valueField=\"value\"\n dataItemKey=\"value\"\n :valuePrimitive=\"true\"\n :valid=\"stateDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n />\n <Error v-if=\"fieldScope && showStateError\">\n {{ resolvedMessages.field.error.state }}\n </Error>\n </div>\n\n <div class=\"zip\">\n <TextBox\n :id=\"fieldIds.zip\"\n :placeholder=\"resolvedMessages.placeholder.zip\"\n :wrapperClass=\"address.zipWrapperClass\"\n :value=\"address.zipDisplay.value\"\n @input=\"address.onZipInput\"\n :valid=\"zipDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n :style=\"{ width: '100%' }\"\n />\n <Error v-if=\"fieldScope && showZipError\">\n {{ resolvedMessages.field.error.zip }}\n </Error>\n <Hint v-if=\"fieldScope && !showZipError\">\n {{ resolvedMessages.field.hint.zip }}\n </Hint>\n </div>\n\n <div v-if=\"fieldsetScope\" class=\"messages\">\n <Error v-if=\"showErrors && !address.addressValid.value\">\n {{ fieldsetErrorMessage }}\n </Error>\n <Error v-else-if=\"showOptionalFeedback\">\n {{ optionalFieldsetErrorMessage }}\n </Error>\n <Hint v-else>{{ resolvedMessages.fieldset.hint.address }}</Hint>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { Error, Hint } from \"@progress/kendo-vue-labels\";\nimport { TextBox } from \"@progress/kendo-vue-inputs\";\nimport { DropDownList } from \"@progress/kendo-vue-dropdowns\";\nimport type {\n USAddressMessageScope,\n USAddressMessages,\n USAddressViewModel,\n} from \"./types\";\n\nconst props = withDefaults(\n defineProps<{\n id: string;\n address: USAddressViewModel;\n required?: boolean;\n messageScope?: USAddressMessageScope;\n messages?: USAddressMessages;\n showAddress2?: boolean;\n }>(),\n {\n required: true,\n messageScope: \"fieldset\",\n showAddress2: true,\n },\n);\n\nconst ZIP_CODE_MESSAGE = \"Enter a 5 or 9 digit zip code.\";\nconst OPTIONAL_FIELDS_MESSAGE = \"Incomplete address.\";\n\ntype USAddressResolvedMessages = {\n placeholder: {\n address1: string;\n address2: string;\n city: string;\n zip: string;\n };\n fieldset: {\n error: {\n required: string;\n zip: string;\n };\n hint: {\n address: string;\n };\n };\n field: {\n error: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n hint: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n };\n};\n\nconst DEFAULT_MESSAGES: USAddressResolvedMessages = {\n placeholder: {\n address1: \"Address Line 1\",\n address2: \"Address Line 2\",\n city: \"City\",\n zip: \"00000-0000\",\n },\n fieldset: {\n error: {\n required: \"Required fields are missing.\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address: \"Enter address information.\",\n },\n },\n field: {\n error: {\n address1: \"Required\",\n address2: \"\",\n city: \"Required\",\n state: \"Required\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address1: \"Enter address line 1.\",\n address2: \"Optional\",\n city: \"\",\n state: \"\",\n zip: ZIP_CODE_MESSAGE,\n },\n },\n};\n\nconst resolveMessages = (\n source?: USAddressMessages,\n): USAddressResolvedMessages => {\n return {\n placeholder: {\n address1:\n source?.placeholder?.address1 ?? DEFAULT_MESSAGES.placeholder.address1,\n address2:\n source?.placeholder?.address2 ?? DEFAULT_MESSAGES.placeholder.address2,\n city: source?.placeholder?.city ?? DEFAULT_MESSAGES.placeholder.city,\n zip: source?.placeholder?.zip ?? DEFAULT_MESSAGES.placeholder.zip,\n },\n fieldset: {\n error: {\n required:\n source?.fieldset?.error?.required ??\n DEFAULT_MESSAGES.fieldset.error.required,\n zip:\n source?.fieldset?.error?.zip ?? DEFAULT_MESSAGES.fieldset.error.zip,\n },\n hint: {\n address:\n source?.fieldset?.hint?.address ??\n DEFAULT_MESSAGES.fieldset.hint.address,\n },\n },\n field: {\n error: {\n address1:\n source?.field?.error?.address1 ??\n DEFAULT_MESSAGES.field.error.address1,\n address2:\n source?.field?.error?.address2 ??\n DEFAULT_MESSAGES.field.error.address2,\n city: source?.field?.error?.city ?? DEFAULT_MESSAGES.field.error.city,\n state:\n source?.field?.error?.state ?? DEFAULT_MESSAGES.field.error.state,\n zip: source?.field?.error?.zip ?? DEFAULT_MESSAGES.field.error.zip,\n },\n hint: {\n address1:\n source?.field?.hint?.address1 ?? DEFAULT_MESSAGES.field.hint.address1,\n address2:\n source?.field?.hint?.address2 ?? DEFAULT_MESSAGES.field.hint.address2,\n city: source?.field?.hint?.city ?? DEFAULT_MESSAGES.field.hint.city,\n state: source?.field?.hint?.state ?? DEFAULT_MESSAGES.field.hint.state,\n zip: source?.field?.hint?.zip ?? DEFAULT_MESSAGES.field.hint.zip,\n },\n },\n };\n};\n\nconst resolvedMessages = computed(() => resolveMessages(props.messages));\n\nconst fieldScope = computed(() => {\n return props.messageScope === \"field\";\n});\n\nconst fieldsetScope = computed(() => {\n return props.messageScope === \"fieldset\";\n});\n\nconst isRequired = computed(() => props.required);\n\nconst showErrors = computed(() => isRequired.value);\n\nconst fieldIds = computed(() => ({\n address1: `${props.id}-address1`,\n address2: `${props.id}-address2`,\n city: `${props.id}-city`,\n state: `${props.id}-state`,\n zip: `${props.id}-zip`,\n}));\n\nconst address = computed(() => props.address);\n\nconst nonZipRequiredFieldsValid = computed(() => {\n return (\n address.value.address1Valid.value &&\n address.value.cityValid.value &&\n address.value.stateValid.value\n );\n});\n\nconst hasAnyOptionalInput = computed(() => {\n return (\n address.value.formData.address1.trim() !== \"\" ||\n address.value.formData.address2.trim() !== \"\" ||\n address.value.formData.city.trim() !== \"\" ||\n (address.value.formData.state ?? \"\").trim() !== \"\" ||\n address.value.formData.zip.replace(/\\D/g, \"\") !== \"\"\n );\n});\n\nconst optionalZipInvalid = computed(() => {\n if (address.value.optionalZipInvalid) {\n return address.value.optionalZipInvalid.value;\n }\n\n const zipDigits = address.value.formData.zip.replace(/\\D/g, \"\");\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n zipDigits.length !== 5 &&\n zipDigits.length !== 9\n );\n});\n\nconst optionalPartialInvalid = computed(() => {\n if (address.value.optionalPartialInvalid) {\n return address.value.optionalPartialInvalid.value;\n }\n\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n !address.value.addressValid.value\n );\n});\n\nconst showOptionalFeedback = computed(() => {\n if (isRequired.value || !optionalPartialInvalid.value) {\n return false;\n }\n\n if (address.value.optionalFeedbackActive) {\n return address.value.optionalFeedbackActive.value;\n }\n\n return false;\n});\n\nconst showAddress1Error = computed(() => {\n return (\n (showErrors.value && !address.value.address1Valid.value) ||\n (showOptionalFeedback.value &&\n address.value.formData.address1.trim() === \"\")\n );\n});\n\nconst showCityError = computed(() => {\n return (\n (showErrors.value && !address.value.cityValid.value) ||\n (showOptionalFeedback.value && address.value.formData.city.trim() === \"\")\n );\n});\n\nconst showStateError = computed(() => {\n return (\n (showErrors.value && !address.value.stateValid.value) ||\n (showOptionalFeedback.value &&\n (address.value.formData.state ?? \"\").trim() === \"\")\n );\n});\n\nconst showZipError = computed(() => {\n return (\n (showErrors.value && !address.value.zipValid.value) ||\n (showOptionalFeedback.value && optionalZipInvalid.value)\n );\n});\n\nconst validationStylesActive = computed(() => {\n return isRequired.value\n ? address.value.addressValidate.value\n : showOptionalFeedback.value;\n});\n\nconst address1DisplayValid = computed(() => {\n return isRequired.value\n ? address.value.address1Valid.value\n : !showAddress1Error.value;\n});\n\nconst cityDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.cityValid.value\n : !showCityError.value;\n});\n\nconst stateDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.stateValid.value\n : !showStateError.value;\n});\n\nconst zipDisplayValid = computed(() => {\n return isRequired.value ? address.value.zipValid.value : !showZipError.value;\n});\n\nconst address2PlaceholderDisplay = computed(() => {\n const basePlaceholder = resolvedMessages.value.placeholder.address2;\n\n if (fieldsetScope.value && isRequired.value) {\n return `${basePlaceholder} (Optional)`;\n }\n return basePlaceholder;\n});\n\nconst fieldsetErrorMessage = computed(() => {\n const messages: string[] = [];\n\n if (!nonZipRequiredFieldsValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.required);\n }\n\n if (!address.value.zipValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n\nconst optionalFieldsetErrorMessage = computed(() => {\n const messages: string[] = [OPTIONAL_FIELDS_MESSAGE];\n\n if (optionalZipInvalid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n</script>\n\n<style scoped>\n.fkui-us-address {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr;\n grid-template-areas:\n \"address1 address1 address1\"\n \"address2 address2 address2\"\n \"city state zip\"\n \"messages messages messages\";\n gap: 0.75rem;\n margin-bottom: 1rem;\n\n .address1 {\n grid-area: address1;\n }\n\n .address2 {\n grid-area: address2;\n }\n\n .city {\n grid-area: city;\n }\n\n .state {\n grid-area: state;\n }\n\n .zip {\n grid-area: zip;\n }\n\n .messages {\n grid-area: messages;\n }\n\n :deep(.fk-zip-textbox) {\n min-width: 100%;\n }\n}\n\n.fkui-us-address--fieldset-scope {\n row-gap: 0.5rem;\n\n .messages {\n margin-top: -0.375rem;\n }\n}\n</style>\n","<template>\n <td\n :id=\"id ?? ids.instanceId\"\n :class=\"['fkui-action-cell', 'k-table-td', className]\"\n :style=\"style\"\n :colspan=\"colSpan\"\n role=\"gridcell\"\n :aria-colindex=\"ariaColumnIndex\"\n :aria-selected=\"isSelected\"\n :data-grid-col-index=\"columnIndex\"\n >\n <Button\n v-for=\"trigger in config.triggers\"\n :key=\"trigger.key\"\n :ref=\"\n hasMenu(trigger)\n ? (element) => registerTrigger(trigger, element)\n : undefined\n \"\n :id=\"ids.compose(trigger.key, 'trigger')\"\n :svg-icon=\"trigger.icon\"\n type=\"button\"\n fill-mode=\"flat\"\n theme-color=\"primary\"\n rounded=\"full\"\n :aria-label=\"trigger.ariaLabel\"\n :aria-haspopup=\"hasMenu(trigger) ? 'menu' : undefined\"\n :aria-expanded=\"hasMenu(trigger) ? isTriggerActive(trigger) : undefined\"\n :disabled=\"trigger.disabled?.(dataItem)\"\n :tabindex=\"tabIndex\"\n @click=\"onTriggerClick(trigger)\"\n @keydown=\"onTriggerKeydown(trigger, $event)\"\n />\n </td>\n</template>\n\n<script setup lang=\"ts\">\nimport type { ComponentPublicInstance } from \"vue\";\nimport { Button } from \"@progress/kendo-vue-buttons\";\nimport type { GridCellProps } from \"@progress/kendo-vue-grid\";\nimport {\n useCompositeId,\n type RegisterableElement,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellMenuController,\n ActionCellTrigger,\n} from \"./types\";\n\ndefineOptions({ inheritAttrs: false });\n\ntype ActionCellProps = Partial<\n Pick<\n GridCellProps,\n | \"id\"\n | \"className\"\n | \"style\"\n | \"colSpan\"\n | \"ariaColumnIndex\"\n | \"isSelected\"\n | \"columnIndex\"\n >\n> & {\n dataItem: any;\n config: ActionCellConfig<any>;\n menuController: ActionCellMenuController<any>;\n tabIndex?: number;\n};\n\nconst props = withDefaults(defineProps<ActionCellProps>(), {\n tabIndex: -1,\n});\n\nconst ids = useCompositeId(\"action-cell\");\n\nconst getTriggerId = (trigger: ActionCellTrigger<any>) =>\n props.menuController.getTriggerId(trigger, props.dataItem);\n\nconst isTriggerActive = (trigger: ActionCellTrigger<any>) =>\n props.menuController.registry.isIdActive(getTriggerId(trigger));\n\nconst hasMenu = (trigger: ActionCellTrigger<any>) =>\n typeof trigger.items === \"function\";\n\nconst registerTrigger = (\n trigger: ActionCellTrigger<any>,\n element: Element | ComponentPublicInstance | null,\n) => {\n props.menuController.registry.register(\n getTriggerId(trigger),\n element as RegisterableElement,\n );\n};\n\nconst onTriggerClick = (trigger: ActionCellTrigger<any>) => {\n if (!hasMenu(trigger)) {\n props.menuController.handleDirectAction?.(trigger, props.dataItem);\n return;\n }\n props.menuController.handleTriggerClick(getTriggerId(trigger));\n};\n\nconst onTriggerKeydown = (\n trigger: ActionCellTrigger<any>,\n ...args: unknown[]\n) => {\n if (!hasMenu(trigger)) return;\n props.menuController.handleTriggerKeydown(getTriggerId(trigger), ...args);\n};\n</script>\n","import {\n computed,\n toValue,\n type ComputedRef,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport {\n useActiveIdRegistry,\n usePopupMenu,\n type KendoMenuSelectEvent,\n type PopupMenuAnchorOptions,\n type PopupMenuElementRef,\n type PopupMenuOffset,\n type PopupMenuTriggerMode,\n type UseExclusiveGroupReturn,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellDataItem,\n ActionCellMenuController,\n ActionCellMenuItem,\n} from \"./types\";\n\nexport type UseActionCellMenuOptions<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Repeatable trigger configuration, rendered by every `ActionCell` instance. */\n config: TConfig;\n /** All rows currently rendered; used to resolve the active row from its registry id. */\n rows: MaybeRefOrGetter<TData[]>;\n /** Derives a stable row id used to build the default registry id for each trigger. */\n getRowId: (row: TData) => string | number;\n /**\n * Overrides the registry ID formatting while preserving `<trigger.key>:<rowId>` semantics.\n * Active row and trigger resolution parse the first colon-separated segment as the trigger\n * key and the remaining segments as the row ID.\n */\n getTriggerId?: (trigger: TConfig[\"triggers\"][number], row: TData) => string;\n /** Ref to the single shared Kendo Menu instance. */\n menuRef: PopupMenuElementRef;\n /** Forwarded to `usePopupMenu`. Defaults to `\"button\"`. */\n triggerMode?: PopupMenuTriggerMode;\n /** Forwarded to `usePopupMenu`. Defaults to `true` for shared-popup positioning. */\n anchor?: PopupMenuAnchorOptions | true;\n /** Forwarded to `usePopupMenu`. */\n resolveFocusTarget?: () => HTMLElement | null;\n /** Coordinates mutual exclusivity with other active-id registries in this group. */\n group?: UseExclusiveGroupReturn;\n /**\n * Runs after a menu item is selected, with its original item and resolved row/trigger.\n * Direct-action triggers have no menu item and pass `undefined`.\n */\n onActionSelected: (\n item: ActionCellMenuItem | undefined,\n row: TData,\n trigger: TConfig[\"triggers\"][number],\n ) => void;\n};\n\nexport type UseActionCellMenuReturn<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Spread onto every `<ActionCell>` instance. */\n actionCellProps: {\n config: TConfig;\n menuController: ActionCellMenuController<TData>;\n };\n /** Spread onto the single shared `<Popup>`. */\n popupProps: ComputedRef<{\n show: boolean;\n offset: PopupMenuOffset;\n onClose: () => void;\n }>;\n /** Spread onto the single shared Kendo `<Menu>`. */\n menuProps: ComputedRef<{\n items: ActionCellMenuItem[];\n vertical: true;\n onKeydown: (event: KeyboardEvent) => void;\n onSelect: (event: KendoMenuSelectEvent<ActionCellMenuItem>) => void;\n }>;\n /** Row resolved from the currently active trigger id, if any. */\n activeRow: ComputedRef<TData | null>;\n /** Trigger config resolved from the currently active trigger id, if any. */\n activeTrigger: ComputedRef<TConfig[\"triggers\"][number] | null>;\n /** Resolved `trigger.title(activeRow)`, or `null` when unset/no trigger is active. Render this yourself (e.g. `<strong>`) above the `<Menu>` — it is not part of `menuProps.items`. */\n activeTitle: ComputedRef<string | null>;\n};\n\n/**\n * Bundles the shared-popup wiring a parent needs to drive `ActionCell`: one\n * `useActiveIdRegistry`, one `usePopupMenu`, and the derived active\n * row/trigger/menu items. The parent still owns the `<Popup>`/`<Menu>`\n * template elements and any business logic for the selected action.\n */\nexport const useActionCellMenu = <\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n>(\n options: UseActionCellMenuOptions<TData, TConfig>,\n): UseActionCellMenuReturn<TData, TConfig> => {\n const registry = useActiveIdRegistry<string>();\n options.group?.register(registry);\n\n const getTriggerId =\n options.getTriggerId ??\n ((trigger: TConfig[\"triggers\"][number], row: TData) =>\n `${trigger.key}:${options.getRowId(row)}`);\n\n const activeTrigger = computed(() => {\n const key = registry.activeId.value?.split(\":\")[0];\n return (\n (options.config.triggers.find((trigger) => trigger.key === key) as\n | TConfig[\"triggers\"][number]\n | undefined) ?? null\n );\n });\n\n const activeRow = computed(() => {\n const rowId = registry.activeId.value?.split(\":\").slice(1).join(\":\");\n if (rowId === undefined) return null;\n return (\n toValue(options.rows).find(\n (row) => String(options.getRowId(row)) === rowId,\n ) ?? null\n );\n });\n\n const activeMenuItems = computed<ActionCellMenuItem[]>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row && trigger ? (trigger.items?.(row) ?? []) : [];\n });\n\n const activeTitle = computed<string | null>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row &&\n trigger &&\n typeof trigger.items === \"function\" &&\n trigger.title\n ? trigger.title(row)\n : null;\n });\n\n const popupMenu = usePopupMenu({\n isOpen: registry.isActive,\n triggerRef: registry.activeElement,\n menuRef: options.menuRef,\n triggerMode: options.triggerMode ?? \"button\",\n anchor: options.anchor ?? true,\n resolveFocusTarget: options.resolveFocusTarget,\n requestShow: (id) => {\n if (typeof id === \"string\") registry.activate(id);\n },\n requestHide: () => registry.deactivate(),\n menuLabel: activeTitle,\n });\n\n const handleTriggerClick = (id: string) => {\n if (registry.isActive.value && !registry.isIdActive(id)) {\n registry.deactivate();\n }\n options.group?.deactivateOthers(registry);\n popupMenu.handleActionButtonClick(id);\n };\n\n const handleDirectAction = (\n trigger: TConfig[\"triggers\"][number],\n row: TData,\n ) => {\n options.group?.deactivateOthers(registry);\n registry.deactivate();\n options.onActionSelected(undefined, row, trigger);\n };\n\n const handleTriggerKeydown = (id: string, ...args: unknown[]) => {\n const event = args[0] as KeyboardEvent;\n if (event.key === \"Enter\" || event.code === \"Space\") {\n event.preventDefault();\n handleTriggerClick(id);\n return;\n }\n popupMenu.handleActionButtonKeydown(event, id);\n };\n\n const onMenuKeydown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") popupMenu.handleActionMenuEscape(event);\n };\n\n const onMenuSelect = (event: KendoMenuSelectEvent<ActionCellMenuItem>) => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n popupMenu.handleMenuSelect(event, () => {\n if (row && trigger) {\n options.onActionSelected(event.item, row, trigger);\n }\n });\n };\n\n return {\n actionCellProps: {\n config: options.config,\n menuController: {\n registry,\n getTriggerId,\n handleTriggerClick,\n handleDirectAction,\n handleTriggerKeydown,\n },\n },\n popupProps: computed(() => ({\n show: registry.isActive.value,\n offset: popupMenu.offset.value,\n onClose: popupMenu.handlePopupClose,\n })),\n menuProps: computed(() => ({\n items: activeMenuItems.value,\n vertical: true as const,\n onKeydown: onMenuKeydown,\n onSelect: onMenuSelect,\n })),\n activeRow,\n activeTrigger,\n activeTitle,\n };\n};\n"],"names":["ZIP_CODE_MESSAGE","OPTIONAL_FIELDS_MESSAGE","props","__props","DEFAULT_MESSAGES","resolveMessages","source","resolvedMessages","computed","fieldScope","fieldsetScope","isRequired","showErrors","fieldIds","address","nonZipRequiredFieldsValid","hasAnyOptionalInput","optionalZipInvalid","zipDigits","optionalPartialInvalid","showOptionalFeedback","showAddress1Error","showCityError","showStateError","showZipError","validationStylesActive","address1DisplayValid","cityDisplayValid","stateDisplayValid","zipDisplayValid","address2PlaceholderDisplay","basePlaceholder","fieldsetErrorMessage","messages","optionalFieldsetErrorMessage","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_createVNode","_unref","TextBox","_Fragment","_createBlock","Error","_createTextVNode","_toDisplayString","Hint","showAddress2","_openBlock","_hoisted_2","_hoisted_3","_hoisted_4","DropDownList","_hoisted_5","_hoisted_6","ids","useCompositeId","getTriggerId","trigger","isTriggerActive","hasMenu","registerTrigger","element","onTriggerClick","onTriggerKeydown","args","id","className","style","colSpan","ariaColumnIndex","isSelected","columnIndex","_renderList","config","Button","dataItem","tabIndex","$event","useActionCellMenu","options","registry","useActiveIdRegistry","row","activeTrigger","key","activeRow","rowId","toValue","activeMenuItems","activeTitle","popupMenu","usePopupMenu","handleTriggerClick","handleDirectAction","handleTriggerKeydown","event","onMenuKeydown","onMenuSelect"],"mappings":"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"}
1
+ {"version":3,"file":"featherk-ui.es.js","sources":["../src/address/USAddress.vue","../src/table/ActionCell.vue","../src/table/useActionCellMenu.ts"],"sourcesContent":["<template>\n <div\n class=\"fkui-us-address\"\n :class=\"{ 'fkui-us-address--fieldset-scope': fieldsetScope }\"\n >\n <div class=\"address1\">\n <TextBox\n :id=\"fieldIds.address1\"\n :placeholder=\"resolvedMessages.placeholder.address1\"\n :value=\"address.formData.address1\"\n :valid=\"address1DisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onAddress1Input\"\n />\n <template v-if=\"fieldScope\">\n <Error v-if=\"showAddress1Error\">\n {{ resolvedMessages.field.error.address1 }}\n </Error>\n <Hint v-else>{{ resolvedMessages.field.hint.address1 }}</Hint>\n </template>\n </div>\n\n <div v-if=\"showAddress2\" class=\"address2\">\n <TextBox\n :id=\"fieldIds.address2\"\n :placeholder=\"address2PlaceholderDisplay\"\n :value=\"address.formData.address2\"\n @input=\"address.onAddress2Input\"\n />\n <Hint v-if=\"fieldScope\">{{ resolvedMessages.field.hint.address2 }}</Hint>\n </div>\n\n <div class=\"city\">\n <TextBox\n :id=\"fieldIds.city\"\n :placeholder=\"resolvedMessages.placeholder.city\"\n :value=\"address.formData.city\"\n :valid=\"cityDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onCityInput\"\n />\n <Error v-if=\"fieldScope && showCityError\">\n {{ resolvedMessages.field.error.city }}\n </Error>\n </div>\n\n <div class=\"state\">\n <DropDownList\n :id=\"fieldIds.state\"\n :value=\"address.formData.state\"\n @change=\"address.onStateChange\"\n :defaultItem=\"address.stateDefaultItem\"\n :dataItems=\"address.stateOptions\"\n textField=\"label\"\n valueField=\"value\"\n dataItemKey=\"value\"\n :valuePrimitive=\"true\"\n :valid=\"stateDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n />\n <Error v-if=\"fieldScope && showStateError\">\n {{ resolvedMessages.field.error.state }}\n </Error>\n </div>\n\n <div class=\"zip\">\n <TextBox\n :id=\"fieldIds.zip\"\n :placeholder=\"resolvedMessages.placeholder.zip\"\n :wrapperClass=\"address.zipWrapperClass\"\n :value=\"address.zipDisplay.value\"\n @input=\"address.onZipInput\"\n :valid=\"zipDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n :style=\"{ width: '100%' }\"\n />\n <Error v-if=\"fieldScope && showZipError\">\n {{ resolvedMessages.field.error.zip }}\n </Error>\n <Hint v-if=\"fieldScope && !showZipError\">\n {{ resolvedMessages.field.hint.zip }}\n </Hint>\n </div>\n\n <div v-if=\"fieldsetScope\" class=\"messages\">\n <Error v-if=\"showErrors && !address.addressValid.value\">\n {{ fieldsetErrorMessage }}\n </Error>\n <Error v-else-if=\"showOptionalFeedback\">\n {{ optionalFieldsetErrorMessage }}\n </Error>\n <Hint v-else>{{ resolvedMessages.fieldset.hint.address }}</Hint>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { Error, Hint } from \"@progress/kendo-vue-labels\";\nimport { TextBox } from \"@progress/kendo-vue-inputs\";\nimport { DropDownList } from \"@progress/kendo-vue-dropdowns\";\nimport type {\n USAddressMessageScope,\n USAddressMessages,\n USAddressViewModel,\n} from \"./types\";\n\nconst props = withDefaults(\n defineProps<{\n id: string;\n address: USAddressViewModel;\n required?: boolean;\n messageScope?: USAddressMessageScope;\n messages?: USAddressMessages;\n showAddress2?: boolean;\n }>(),\n {\n required: true,\n messageScope: \"fieldset\",\n showAddress2: true,\n },\n);\n\nconst ZIP_CODE_MESSAGE = \"Enter a 5 or 9 digit zip code.\";\nconst OPTIONAL_FIELDS_MESSAGE = \"Incomplete address.\";\n\ntype USAddressResolvedMessages = {\n placeholder: {\n address1: string;\n address2: string;\n city: string;\n zip: string;\n };\n fieldset: {\n error: {\n required: string;\n zip: string;\n };\n hint: {\n address: string;\n };\n };\n field: {\n error: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n hint: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n };\n};\n\nconst DEFAULT_MESSAGES: USAddressResolvedMessages = {\n placeholder: {\n address1: \"Address Line 1\",\n address2: \"Address Line 2\",\n city: \"City\",\n zip: \"00000-0000\",\n },\n fieldset: {\n error: {\n required: \"Required fields are missing.\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address: \"Enter address information.\",\n },\n },\n field: {\n error: {\n address1: \"Required\",\n address2: \"\",\n city: \"Required\",\n state: \"Required\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address1: \"Enter address line 1.\",\n address2: \"Optional\",\n city: \"\",\n state: \"\",\n zip: ZIP_CODE_MESSAGE,\n },\n },\n};\n\nconst resolveMessages = (\n source?: USAddressMessages,\n): USAddressResolvedMessages => {\n return {\n placeholder: {\n address1:\n source?.placeholder?.address1 ?? DEFAULT_MESSAGES.placeholder.address1,\n address2:\n source?.placeholder?.address2 ?? DEFAULT_MESSAGES.placeholder.address2,\n city: source?.placeholder?.city ?? DEFAULT_MESSAGES.placeholder.city,\n zip: source?.placeholder?.zip ?? DEFAULT_MESSAGES.placeholder.zip,\n },\n fieldset: {\n error: {\n required:\n source?.fieldset?.error?.required ??\n DEFAULT_MESSAGES.fieldset.error.required,\n zip:\n source?.fieldset?.error?.zip ?? DEFAULT_MESSAGES.fieldset.error.zip,\n },\n hint: {\n address:\n source?.fieldset?.hint?.address ??\n DEFAULT_MESSAGES.fieldset.hint.address,\n },\n },\n field: {\n error: {\n address1:\n source?.field?.error?.address1 ??\n DEFAULT_MESSAGES.field.error.address1,\n address2:\n source?.field?.error?.address2 ??\n DEFAULT_MESSAGES.field.error.address2,\n city: source?.field?.error?.city ?? DEFAULT_MESSAGES.field.error.city,\n state:\n source?.field?.error?.state ?? DEFAULT_MESSAGES.field.error.state,\n zip: source?.field?.error?.zip ?? DEFAULT_MESSAGES.field.error.zip,\n },\n hint: {\n address1:\n source?.field?.hint?.address1 ?? DEFAULT_MESSAGES.field.hint.address1,\n address2:\n source?.field?.hint?.address2 ?? DEFAULT_MESSAGES.field.hint.address2,\n city: source?.field?.hint?.city ?? DEFAULT_MESSAGES.field.hint.city,\n state: source?.field?.hint?.state ?? DEFAULT_MESSAGES.field.hint.state,\n zip: source?.field?.hint?.zip ?? DEFAULT_MESSAGES.field.hint.zip,\n },\n },\n };\n};\n\nconst resolvedMessages = computed(() => resolveMessages(props.messages));\n\nconst fieldScope = computed(() => {\n return props.messageScope === \"field\";\n});\n\nconst fieldsetScope = computed(() => {\n return props.messageScope === \"fieldset\";\n});\n\nconst isRequired = computed(() => props.required);\n\nconst showErrors = computed(() => isRequired.value);\n\nconst fieldIds = computed(() => ({\n address1: `${props.id}-address1`,\n address2: `${props.id}-address2`,\n city: `${props.id}-city`,\n state: `${props.id}-state`,\n zip: `${props.id}-zip`,\n}));\n\nconst address = computed(() => props.address);\n\nconst nonZipRequiredFieldsValid = computed(() => {\n return (\n address.value.address1Valid.value &&\n address.value.cityValid.value &&\n address.value.stateValid.value\n );\n});\n\nconst hasAnyOptionalInput = computed(() => {\n return (\n address.value.formData.address1.trim() !== \"\" ||\n address.value.formData.address2.trim() !== \"\" ||\n address.value.formData.city.trim() !== \"\" ||\n (address.value.formData.state ?? \"\").trim() !== \"\" ||\n address.value.formData.zip.replace(/\\D/g, \"\") !== \"\"\n );\n});\n\nconst optionalZipInvalid = computed(() => {\n if (address.value.optionalZipInvalid) {\n return address.value.optionalZipInvalid.value;\n }\n\n const zipDigits = address.value.formData.zip.replace(/\\D/g, \"\");\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n zipDigits.length !== 5 &&\n zipDigits.length !== 9\n );\n});\n\nconst optionalPartialInvalid = computed(() => {\n if (address.value.optionalPartialInvalid) {\n return address.value.optionalPartialInvalid.value;\n }\n\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n !address.value.addressValid.value\n );\n});\n\nconst showOptionalFeedback = computed(() => {\n if (isRequired.value || !optionalPartialInvalid.value) {\n return false;\n }\n\n if (address.value.optionalFeedbackActive) {\n return address.value.optionalFeedbackActive.value;\n }\n\n return false;\n});\n\nconst showAddress1Error = computed(() => {\n return (\n (showErrors.value && !address.value.address1Valid.value) ||\n (showOptionalFeedback.value &&\n address.value.formData.address1.trim() === \"\")\n );\n});\n\nconst showCityError = computed(() => {\n return (\n (showErrors.value && !address.value.cityValid.value) ||\n (showOptionalFeedback.value && address.value.formData.city.trim() === \"\")\n );\n});\n\nconst showStateError = computed(() => {\n return (\n (showErrors.value && !address.value.stateValid.value) ||\n (showOptionalFeedback.value &&\n (address.value.formData.state ?? \"\").trim() === \"\")\n );\n});\n\nconst showZipError = computed(() => {\n return (\n (showErrors.value && !address.value.zipValid.value) ||\n (showOptionalFeedback.value && optionalZipInvalid.value)\n );\n});\n\nconst validationStylesActive = computed(() => {\n return isRequired.value\n ? address.value.addressValidate.value\n : showOptionalFeedback.value;\n});\n\nconst address1DisplayValid = computed(() => {\n return isRequired.value\n ? address.value.address1Valid.value\n : !showAddress1Error.value;\n});\n\nconst cityDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.cityValid.value\n : !showCityError.value;\n});\n\nconst stateDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.stateValid.value\n : !showStateError.value;\n});\n\nconst zipDisplayValid = computed(() => {\n return isRequired.value ? address.value.zipValid.value : !showZipError.value;\n});\n\nconst address2PlaceholderDisplay = computed(() => {\n const basePlaceholder = resolvedMessages.value.placeholder.address2;\n\n if (fieldsetScope.value && isRequired.value) {\n return `${basePlaceholder} (Optional)`;\n }\n return basePlaceholder;\n});\n\nconst fieldsetErrorMessage = computed(() => {\n const messages: string[] = [];\n\n if (!nonZipRequiredFieldsValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.required);\n }\n\n if (!address.value.zipValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n\nconst optionalFieldsetErrorMessage = computed(() => {\n const messages: string[] = [OPTIONAL_FIELDS_MESSAGE];\n\n if (optionalZipInvalid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n</script>\n\n<style scoped>\n.fkui-us-address {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr;\n grid-template-areas:\n \"address1 address1 address1\"\n \"address2 address2 address2\"\n \"city state zip\"\n \"messages messages messages\";\n gap: 0.75rem;\n margin-bottom: 1rem;\n\n .address1 {\n grid-area: address1;\n }\n\n .address2 {\n grid-area: address2;\n }\n\n .city {\n grid-area: city;\n }\n\n .state {\n grid-area: state;\n }\n\n .zip {\n grid-area: zip;\n }\n\n .messages {\n grid-area: messages;\n }\n\n :deep(.fk-zip-textbox) {\n min-width: 100%;\n }\n}\n\n.fkui-us-address--fieldset-scope {\n row-gap: 0.5rem;\n\n .messages {\n margin-top: -0.375rem;\n }\n}\n</style>\n","<template>\n <td\n :id=\"id ?? ids.instanceId\"\n :class=\"['fkui-action-cell', 'k-table-td', className]\"\n :style=\"style\"\n :colspan=\"colSpan\"\n role=\"gridcell\"\n :aria-colindex=\"ariaColumnIndex\"\n :aria-selected=\"isSelected\"\n :data-grid-col-index=\"columnIndex\"\n >\n <Button\n v-for=\"trigger in config.triggers\"\n :key=\"trigger.key\"\n :ref=\"\n hasMenu(trigger)\n ? (element) => registerTrigger(trigger, element)\n : undefined\n \"\n :id=\"ids.compose(trigger.key, 'trigger')\"\n :svg-icon=\"trigger.icon\"\n type=\"button\"\n fill-mode=\"flat\"\n theme-color=\"primary\"\n rounded=\"full\"\n :aria-label=\"trigger.ariaLabel\"\n :aria-haspopup=\"hasMenu(trigger) ? 'menu' : undefined\"\n :aria-expanded=\"hasMenu(trigger) ? isTriggerActive(trigger) : undefined\"\n :disabled=\"trigger.disabled?.(dataItem)\"\n :tabindex=\"tabIndex\"\n @click=\"onTriggerClick(trigger)\"\n @keydown=\"onTriggerKeydown(trigger, $event)\"\n />\n </td>\n</template>\n\n<script setup lang=\"ts\">\nimport type { ComponentPublicInstance } from \"vue\";\nimport { Button } from \"@progress/kendo-vue-buttons\";\nimport type { GridCellProps } from \"@progress/kendo-vue-grid\";\nimport {\n useCompositeId,\n type RegisterableElement,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellMenuController,\n ActionCellTrigger,\n} from \"./types\";\n\ndefineOptions({ inheritAttrs: false });\n\ntype ActionCellProps = Partial<\n Pick<\n GridCellProps,\n | \"id\"\n | \"className\"\n | \"style\"\n | \"colSpan\"\n | \"ariaColumnIndex\"\n | \"isSelected\"\n | \"columnIndex\"\n >\n> & {\n dataItem: any;\n config: ActionCellConfig<any>;\n menuController: ActionCellMenuController<any>;\n tabIndex?: number;\n};\n\nconst props = withDefaults(defineProps<ActionCellProps>(), {\n tabIndex: -1,\n});\n\nconst ids = useCompositeId(\"action-cell\");\n\nconst getTriggerId = (trigger: ActionCellTrigger<any>) =>\n props.menuController.getTriggerId(trigger, props.dataItem);\n\nconst isTriggerActive = (trigger: ActionCellTrigger<any>) =>\n props.menuController.registry.isIdActive(getTriggerId(trigger));\n\nconst hasMenu = (trigger: ActionCellTrigger<any>) =>\n typeof trigger.items === \"function\";\n\nconst registerTrigger = (\n trigger: ActionCellTrigger<any>,\n element: Element | ComponentPublicInstance | null,\n) => {\n props.menuController.registry.register(\n getTriggerId(trigger),\n element as RegisterableElement,\n );\n};\n\nconst onTriggerClick = (trigger: ActionCellTrigger<any>) => {\n if (!hasMenu(trigger)) {\n props.menuController.handleDirectAction?.(trigger, props.dataItem);\n return;\n }\n props.menuController.handleTriggerClick(getTriggerId(trigger));\n};\n\nconst onTriggerKeydown = (\n trigger: ActionCellTrigger<any>,\n ...args: unknown[]\n) => {\n if (!hasMenu(trigger)) return;\n props.menuController.handleTriggerKeydown(getTriggerId(trigger), ...args);\n};\n</script>\n","import {\n computed,\n nextTick,\n toValue,\n type ComputedRef,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport {\n useActiveIdRegistry,\n usePopupMenu,\n type KendoMenuSelectEvent,\n type PopupMenuAnchorOptions,\n type PopupMenuElementRef,\n type PopupMenuOffset,\n type PopupMenuTriggerMode,\n type UseExclusiveGroupReturn,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellDataItem,\n ActionCellMenuController,\n ActionCellMenuItem,\n} from \"./types\";\n\nexport type UseActionCellMenuOptions<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Repeatable trigger configuration, rendered by every `ActionCell` instance. */\n config: TConfig;\n /** All rows currently rendered; used to resolve the active row from its registry id. */\n rows: MaybeRefOrGetter<TData[]>;\n /** Derives a stable row id used to build the default registry id for each trigger. */\n getRowId: (row: TData) => string | number;\n /**\n * Overrides the registry ID formatting while preserving `<trigger.key>:<rowId>` semantics.\n * Active row and trigger resolution parse the first colon-separated segment as the trigger\n * key and the remaining segments as the row ID.\n */\n getTriggerId?: (trigger: TConfig[\"triggers\"][number], row: TData) => string;\n /** Ref to the single shared Kendo Menu instance. */\n menuRef: PopupMenuElementRef;\n /** Forwarded to `usePopupMenu`. Defaults to `\"button\"`. */\n triggerMode?: PopupMenuTriggerMode;\n /** Forwarded to `usePopupMenu`. Defaults to `true` for shared-popup positioning. */\n anchor?: PopupMenuAnchorOptions | true;\n /** Forwarded to `usePopupMenu`. */\n resolveFocusTarget?: () => HTMLElement | null;\n /** Forwarded to `usePopupMenu`. */\n focusTargetContainerSelector?: string;\n /** Coordinates mutual exclusivity with other active-id registries in this group. */\n group?: UseExclusiveGroupReturn;\n /**\n * Runs after a menu item is selected, with its original item and resolved row/trigger.\n * Direct-action triggers have no menu item and pass `undefined`.\n */\n onActionSelected: (\n item: ActionCellMenuItem | undefined,\n row: TData,\n trigger: TConfig[\"triggers\"][number],\n ) => void;\n};\n\nexport type UseActionCellMenuReturn<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Spread onto every `<ActionCell>` instance. */\n actionCellProps: {\n config: TConfig;\n menuController: ActionCellMenuController<TData>;\n };\n /** Spread onto the single shared `<Popup>`. */\n popupProps: ComputedRef<{\n show: boolean;\n offset: PopupMenuOffset;\n onClose: () => void;\n }>;\n /** Spread onto the single shared Kendo `<Menu>`. */\n menuProps: ComputedRef<{\n items: ActionCellMenuItem[];\n vertical: true;\n onKeydown: (event: KeyboardEvent) => void;\n onSelect: (event: KendoMenuSelectEvent<ActionCellMenuItem>) => void;\n }>;\n /** Row resolved from the currently active trigger id, if any. */\n activeRow: ComputedRef<TData | null>;\n /** Trigger config resolved from the currently active trigger id, if any. */\n activeTrigger: ComputedRef<TConfig[\"triggers\"][number] | null>;\n /** Resolved `trigger.title(activeRow)`, or `null` when unset/no trigger is active. Render this yourself (e.g. `<strong>`) above the `<Menu>` — it is not part of `menuProps.items`. */\n activeTitle: ComputedRef<string | null>;\n};\n\n/**\n * Bundles the shared-popup wiring a parent needs to drive `ActionCell`: one\n * `useActiveIdRegistry`, one `usePopupMenu`, and the derived active\n * row/trigger/menu items. The parent still owns the `<Popup>`/`<Menu>`\n * template elements and any business logic for the selected action.\n */\nexport const useActionCellMenu = <\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n>(\n options: UseActionCellMenuOptions<TData, TConfig>,\n): UseActionCellMenuReturn<TData, TConfig> => {\n const registry = useActiveIdRegistry<string>();\n options.group?.register(registry);\n\n const getTriggerId =\n options.getTriggerId ??\n ((trigger: TConfig[\"triggers\"][number], row: TData) =>\n `${trigger.key}:${options.getRowId(row)}`);\n\n const activeTrigger = computed(() => {\n const key = registry.activeId.value?.split(\":\")[0];\n return (\n (options.config.triggers.find((trigger) => trigger.key === key) as\n | TConfig[\"triggers\"][number]\n | undefined) ?? null\n );\n });\n\n const activeRow = computed(() => {\n const rowId = registry.activeId.value?.split(\":\").slice(1).join(\":\");\n if (rowId === undefined) return null;\n return (\n toValue(options.rows).find(\n (row) => String(options.getRowId(row)) === rowId,\n ) ?? null\n );\n });\n\n const activeMenuItems = computed<ActionCellMenuItem[]>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row && trigger ? (trigger.items?.(row) ?? []) : [];\n });\n\n const activeTitle = computed<string | null>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row &&\n trigger &&\n typeof trigger.items === \"function\" &&\n trigger.title\n ? trigger.title(row)\n : null;\n });\n\n const popupMenu = usePopupMenu({\n isOpen: registry.isActive,\n triggerRef: registry.activeElement,\n menuRef: options.menuRef,\n triggerMode: options.triggerMode ?? \"button\",\n anchor: options.anchor ?? true,\n resolveFocusTarget: options.resolveFocusTarget,\n focusTargetContainerSelector: options.focusTargetContainerSelector,\n requestShow: (id) => {\n if (typeof id === \"string\") registry.activate(id);\n },\n requestHide: () => registry.deactivate(),\n menuLabel: activeTitle,\n });\n\n let triggerInteractionSequence = 0;\n\n const handleTriggerClick = (id: string) => {\n const interactionSequence = ++triggerInteractionSequence;\n options.group?.deactivateOthers(registry);\n\n if (registry.isActive.value && !registry.isIdActive(id)) {\n registry.deactivate();\n void nextTick(() => {\n if (interactionSequence === triggerInteractionSequence) {\n popupMenu.handleTriggerClick(id);\n }\n });\n return;\n }\n\n popupMenu.handleTriggerClick(id);\n };\n\n const handleDirectAction = (\n trigger: TConfig[\"triggers\"][number],\n row: TData,\n ) => {\n triggerInteractionSequence++;\n options.group?.deactivateOthers(registry);\n registry.deactivate();\n options.onActionSelected(undefined, row, trigger);\n };\n\n const handleTriggerKeydown = (id: string, ...args: unknown[]) => {\n const event = args[0] as KeyboardEvent;\n if (event.key === \"Enter\" || event.code === \"Space\") {\n event.preventDefault();\n handleTriggerClick(id);\n return;\n }\n popupMenu.handleTriggerKeydown(event, id);\n };\n\n const onMenuKeydown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") popupMenu.handleMenuEscape(event);\n };\n\n const onMenuSelect = (event: KendoMenuSelectEvent<ActionCellMenuItem>) => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n popupMenu.handleMenuSelect(event, () => {\n if (row && trigger) {\n options.onActionSelected(event.item, row, trigger);\n }\n });\n };\n\n return {\n actionCellProps: {\n config: options.config,\n menuController: {\n registry,\n getTriggerId,\n handleTriggerClick,\n handleDirectAction,\n handleTriggerKeydown,\n },\n },\n popupProps: computed(() => ({\n show: registry.isActive.value,\n offset: popupMenu.offset.value,\n onClose: popupMenu.handlePopupClose,\n })),\n menuProps: computed(() => ({\n items: activeMenuItems.value,\n vertical: true as const,\n onKeydown: onMenuKeydown,\n onSelect: onMenuSelect,\n })),\n activeRow,\n activeTrigger,\n activeTitle,\n };\n};\n"],"names":["ZIP_CODE_MESSAGE","OPTIONAL_FIELDS_MESSAGE","props","__props","DEFAULT_MESSAGES","resolveMessages","source","resolvedMessages","computed","fieldScope","fieldsetScope","isRequired","showErrors","fieldIds","address","nonZipRequiredFieldsValid","hasAnyOptionalInput","optionalZipInvalid","zipDigits","optionalPartialInvalid","showOptionalFeedback","showAddress1Error","showCityError","showStateError","showZipError","validationStylesActive","address1DisplayValid","cityDisplayValid","stateDisplayValid","zipDisplayValid","address2PlaceholderDisplay","basePlaceholder","fieldsetErrorMessage","messages","optionalFieldsetErrorMessage","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_createVNode","_unref","TextBox","_Fragment","_createBlock","Error","_createTextVNode","_toDisplayString","Hint","showAddress2","_openBlock","_hoisted_2","_hoisted_3","_hoisted_4","DropDownList","_hoisted_5","_hoisted_6","ids","useCompositeId","getTriggerId","trigger","isTriggerActive","hasMenu","registerTrigger","element","onTriggerClick","onTriggerKeydown","args","id","className","style","colSpan","ariaColumnIndex","isSelected","columnIndex","_renderList","config","Button","dataItem","tabIndex","$event","useActionCellMenu","options","registry","useActiveIdRegistry","row","activeTrigger","key","activeRow","rowId","toValue","activeMenuItems","activeTitle","popupMenu","usePopupMenu","triggerInteractionSequence","handleTriggerClick","interactionSequence","nextTick","handleDirectAction","handleTriggerKeydown","event","onMenuKeydown","onMenuSelect"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(p,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@progress/kendo-vue-labels"),require("@progress/kendo-vue-inputs"),require("@progress/kendo-vue-dropdowns"),require("@progress/kendo-vue-buttons"),require("@featherk/composables")):typeof define=="function"&&define.amd?define(["exports","vue","@progress/kendo-vue-labels","@progress/kendo-vue-inputs","@progress/kendo-vue-dropdowns","@progress/kendo-vue-buttons","@featherk/composables"],e):(p=typeof globalThis<"u"?globalThis:p||self,e(p.FeatherKUi={},p.Vue,p.KendoVueLabels,p.KendoVueInputs,p.KendoVueDropdowns,p.KendoVueButtons,p.FeatherKComposables))})(this,(function(p,e,y,I,E,z,S){"use strict";const A={class:"address1"},x={key:0,class:"address2"},T={class:"city"},N={class:"state"},q={class:"zip"},M={key:1,class:"messages"},B="Enter a 5 or 9 digit zip code.",b="Incomplete address.",F=((s,a)=>{const i=s.__vccOpts||s;for(const[v,o]of a)i[v]=o;return i})(e.defineComponent({__name:"USAddress",props:{id:{},address:{},required:{type:Boolean,default:!0},messageScope:{default:"fieldset"},messages:{},showAddress2:{type:Boolean,default:!0}},setup(s){const a=s,i={placeholder:{address1:"Address Line 1",address2:"Address Line 2",city:"City",zip:"00000-0000"},fieldset:{error:{required:"Required fields are missing.",zip:B},hint:{address:"Enter address information."}},field:{error:{address1:"Required",address2:"",city:"Required",state:"Required",zip:B},hint:{address1:"Enter address line 1.",address2:"Optional",city:"",state:"",zip:B}}},v=d=>({placeholder:{address1:d?.placeholder?.address1??i.placeholder.address1,address2:d?.placeholder?.address2??i.placeholder.address2,city:d?.placeholder?.city??i.placeholder.city,zip:d?.placeholder?.zip??i.placeholder.zip},fieldset:{error:{required:d?.fieldset?.error?.required??i.fieldset.error.required,zip:d?.fieldset?.error?.zip??i.fieldset.error.zip},hint:{address:d?.fieldset?.hint?.address??i.fieldset.hint.address}},field:{error:{address1:d?.field?.error?.address1??i.field.error.address1,address2:d?.field?.error?.address2??i.field.error.address2,city:d?.field?.error?.city??i.field.error.city,state:d?.field?.error?.state??i.field.error.state,zip:d?.field?.error?.zip??i.field.error.zip},hint:{address1:d?.field?.hint?.address1??i.field.hint.address1,address2:d?.field?.hint?.address2??i.field.hint.address2,city:d?.field?.hint?.city??i.field.hint.city,state:d?.field?.hint?.state??i.field.hint.state,zip:d?.field?.hint?.zip??i.field.hint.zip}}}),o=e.computed(()=>v(a.messages)),f=e.computed(()=>a.messageScope==="field"),k=e.computed(()=>a.messageScope==="fieldset"),c=e.computed(()=>a.required),h=e.computed(()=>c.value),l=e.computed(()=>({address1:`${a.id}-address1`,address2:`${a.id}-address2`,city:`${a.id}-city`,state:`${a.id}-state`,zip:`${a.id}-zip`})),t=e.computed(()=>a.address),u=e.computed(()=>t.value.address1Valid.value&&t.value.cityValid.value&&t.value.stateValid.value),g=e.computed(()=>t.value.formData.address1.trim()!==""||t.value.formData.address2.trim()!==""||t.value.formData.city.trim()!==""||(t.value.formData.state??"").trim()!==""||t.value.formData.zip.replace(/\D/g,"")!==""),r=e.computed(()=>{if(t.value.optionalZipInvalid)return t.value.optionalZipInvalid.value;const d=t.value.formData.zip.replace(/\D/g,"");return!c.value&&g.value&&d.length!==5&&d.length!==9}),n=e.computed(()=>t.value.optionalPartialInvalid?t.value.optionalPartialInvalid.value:!c.value&&g.value&&!t.value.addressValid.value),m=e.computed(()=>c.value||!n.value?!1:t.value.optionalFeedbackActive?t.value.optionalFeedbackActive.value:!1),D=e.computed(()=>h.value&&!t.value.address1Valid.value||m.value&&t.value.formData.address1.trim()===""),V=e.computed(()=>h.value&&!t.value.cityValid.value||m.value&&t.value.formData.city.trim()===""),_=e.computed(()=>h.value&&!t.value.stateValid.value||m.value&&(t.value.formData.state??"").trim()===""),w=e.computed(()=>h.value&&!t.value.zipValid.value||m.value&&r.value),C=e.computed(()=>c.value?t.value.addressValidate.value:m.value),R=e.computed(()=>c.value?t.value.address1Valid.value:!D.value),$=e.computed(()=>c.value?t.value.cityValid.value:!V.value),Z=e.computed(()=>c.value?t.value.stateValid.value:!_.value),j=e.computed(()=>c.value?t.value.zipValid.value:!w.value),H=e.computed(()=>{const d=o.value.placeholder.address2;return k.value&&c.value?`${d} (Optional)`:d}),U=e.computed(()=>{const d=[];return u.value||d.push(o.value.fieldset.error.required),t.value.zipValid.value||d.push(o.value.fieldset.error.zip),d.join(" ")}),G=e.computed(()=>{const d=[b];return r.value&&d.push(o.value.fieldset.error.zip),d.join(" ")});return(d,J)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["fkui-us-address",{"fkui-us-address--fieldset-scope":k.value}])},[e.createElementVNode("div",A,[e.createVNode(e.unref(I.TextBox),{id:l.value.address1,placeholder:o.value.placeholder.address1,value:t.value.formData.address1,valid:R.value,validate:C.value,validityStyles:C.value,onInput:t.value.onAddress1Input},null,8,["id","placeholder","value","valid","validate","validityStyles","onInput"]),f.value?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[D.value?(e.openBlock(),e.createBlock(e.unref(y.Error),{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.value.field.error.address1),1)]),_:1})):(e.openBlock(),e.createBlock(e.unref(y.Hint),{key:1},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.value.field.hint.address1),1)]),_:1}))],64)):e.createCommentVNode("",!0)]),d.showAddress2?(e.openBlock(),e.createElementBlock("div",x,[e.createVNode(e.unref(I.TextBox),{id:l.value.address2,placeholder:H.value,value:t.value.formData.address2,onInput:t.value.onAddress2Input},null,8,["id","placeholder","value","onInput"]),f.value?(e.openBlock(),e.createBlock(e.unref(y.Hint),{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.value.field.hint.address2),1)]),_:1})):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0),e.createElementVNode("div",T,[e.createVNode(e.unref(I.TextBox),{id:l.value.city,placeholder:o.value.placeholder.city,value:t.value.formData.city,valid:$.value,validate:C.value,validityStyles:C.value,onInput:t.value.onCityInput},null,8,["id","placeholder","value","valid","validate","validityStyles","onInput"]),f.value&&V.value?(e.openBlock(),e.createBlock(e.unref(y.Error),{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.value.field.error.city),1)]),_:1})):e.createCommentVNode("",!0)]),e.createElementVNode("div",N,[e.createVNode(e.unref(E.DropDownList),{id:l.value.state,value:t.value.formData.state,onChange:t.value.onStateChange,defaultItem:t.value.stateDefaultItem,dataItems:t.value.stateOptions,textField:"label",valueField:"value",dataItemKey:"value",valuePrimitive:!0,valid:Z.value,validate:C.value,validityStyles:C.value},null,8,["id","value","onChange","defaultItem","dataItems","valid","validate","validityStyles"]),f.value&&_.value?(e.openBlock(),e.createBlock(e.unref(y.Error),{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.value.field.error.state),1)]),_:1})):e.createCommentVNode("",!0)]),e.createElementVNode("div",q,[e.createVNode(e.unref(I.TextBox),{id:l.value.zip,placeholder:o.value.placeholder.zip,wrapperClass:t.value.zipWrapperClass,value:t.value.zipDisplay.value,onInput:t.value.onZipInput,valid:j.value,validate:C.value,validityStyles:C.value,style:{width:"100%"}},null,8,["id","placeholder","wrapperClass","value","onInput","valid","validate","validityStyles"]),f.value&&w.value?(e.openBlock(),e.createBlock(e.unref(y.Error),{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.value.field.error.zip),1)]),_:1})):e.createCommentVNode("",!0),f.value&&!w.value?(e.openBlock(),e.createBlock(e.unref(y.Hint),{key:1},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.value.field.hint.zip),1)]),_:1})):e.createCommentVNode("",!0)]),k.value?(e.openBlock(),e.createElementBlock("div",M,[h.value&&!t.value.addressValid.value?(e.openBlock(),e.createBlock(e.unref(y.Error),{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(U.value),1)]),_:1})):m.value?(e.openBlock(),e.createBlock(e.unref(y.Error),{key:1},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(G.value),1)]),_:1})):(e.openBlock(),e.createBlock(e.unref(y.Hint),{key:2},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.value.fieldset.hint.address),1)]),_:1}))])):e.createCommentVNode("",!0)],2))}}),[["__scopeId","data-v-8aeb035b"]]),K=["id","colspan","aria-colindex","aria-selected","data-grid-col-index"],P=e.defineComponent({inheritAttrs:!1,__name:"ActionCell",props:{id:{},className:{},style:{},colSpan:{},ariaColumnIndex:{},isSelected:{type:Boolean},columnIndex:{},dataItem:{},config:{},menuController:{},tabIndex:{default:-1}},setup(s){const a=s,i=S.useCompositeId("action-cell"),v=l=>a.menuController.getTriggerId(l,a.dataItem),o=l=>a.menuController.registry.isIdActive(v(l)),f=l=>typeof l.items=="function",k=(l,t)=>{a.menuController.registry.register(v(l),t)},c=l=>{if(!f(l)){a.menuController.handleDirectAction?.(l,a.dataItem);return}a.menuController.handleTriggerClick(v(l))},h=(l,...t)=>{f(l)&&a.menuController.handleTriggerKeydown(v(l),...t)};return(l,t)=>(e.openBlock(),e.createElementBlock("td",{id:l.id??e.unref(i).instanceId,class:e.normalizeClass(["fkui-action-cell","k-table-td",l.className]),style:e.normalizeStyle(l.style),colspan:l.colSpan,role:"gridcell","aria-colindex":l.ariaColumnIndex,"aria-selected":l.isSelected,"data-grid-col-index":l.columnIndex},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.config.triggers,u=>(e.openBlock(),e.createBlock(e.unref(z.Button),{key:u.key,ref_for:!0,ref:f(u)?g=>k(u,g):void 0,id:e.unref(i).compose(u.key,"trigger"),"svg-icon":u.icon,type:"button","fill-mode":"flat","theme-color":"primary",rounded:"full","aria-label":u.ariaLabel,"aria-haspopup":f(u)?"menu":void 0,"aria-expanded":f(u)?o(u):void 0,disabled:u.disabled?.(l.dataItem),tabindex:l.tabIndex,onClick:g=>c(u),onKeydown:g=>h(u,g)},null,8,["id","svg-icon","aria-label","aria-haspopup","aria-expanded","disabled","tabindex","onClick","onKeydown"]))),128))],14,K))}}),O=s=>{const a=S.useActiveIdRegistry();s.group?.register(a);const i=s.getTriggerId??((r,n)=>`${r.key}:${s.getRowId(n)}`),v=e.computed(()=>{const r=a.activeId.value?.split(":")[0];return s.config.triggers.find(n=>n.key===r)??null}),o=e.computed(()=>{const r=a.activeId.value?.split(":").slice(1).join(":");return r===void 0?null:e.toValue(s.rows).find(n=>String(s.getRowId(n))===r)??null}),f=e.computed(()=>{const r=o.value,n=v.value;return r&&n?n.items?.(r)??[]:[]}),k=e.computed(()=>{const r=o.value,n=v.value;return r&&n&&typeof n.items=="function"&&n.title?n.title(r):null}),c=S.usePopupMenu({isOpen:a.isActive,triggerRef:a.activeElement,menuRef:s.menuRef,triggerMode:s.triggerMode??"button",anchor:s.anchor??!0,resolveFocusTarget:s.resolveFocusTarget,requestShow:r=>{typeof r=="string"&&a.activate(r)},requestHide:()=>a.deactivate(),menuLabel:k}),h=r=>{a.isActive.value&&!a.isIdActive(r)&&a.deactivate(),s.group?.deactivateOthers(a),c.handleActionButtonClick(r)},l=(r,n)=>{s.group?.deactivateOthers(a),a.deactivate(),s.onActionSelected(void 0,n,r)},t=(r,...n)=>{const m=n[0];if(m.key==="Enter"||m.code==="Space"){m.preventDefault(),h(r);return}c.handleActionButtonKeydown(m,r)},u=r=>{r.key==="Escape"&&c.handleActionMenuEscape(r)},g=r=>{const n=o.value,m=v.value;c.handleMenuSelect(r,()=>{n&&m&&s.onActionSelected(r.item,n,m)})};return{actionCellProps:{config:s.config,menuController:{registry:a,getTriggerId:i,handleTriggerClick:h,handleDirectAction:l,handleTriggerKeydown:t}},popupProps:e.computed(()=>({show:a.isActive.value,offset:c.offset.value,onClose:c.handlePopupClose})),menuProps:e.computed(()=>({items:f.value,vertical:!0,onKeydown:u,onSelect:g})),activeRow:o,activeTrigger:v,activeTitle:k}};p.ActionCell=P,p.USAddress=F,p.useActionCellMenu=O,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(p,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@progress/kendo-vue-labels"),require("@progress/kendo-vue-inputs"),require("@progress/kendo-vue-dropdowns"),require("@progress/kendo-vue-buttons"),require("@featherk/composables")):typeof define=="function"&&define.amd?define(["exports","vue","@progress/kendo-vue-labels","@progress/kendo-vue-inputs","@progress/kendo-vue-dropdowns","@progress/kendo-vue-buttons","@featherk/composables"],e):(p=typeof globalThis<"u"?globalThis:p||self,e(p.FeatherKUi={},p.Vue,p.KendoVueLabels,p.KendoVueInputs,p.KendoVueDropdowns,p.KendoVueButtons,p.FeatherKComposables))})(this,(function(p,e,y,S,_,E,w){"use strict";const z={class:"address1"},x={key:0,class:"address2"},A={class:"city"},N={class:"state"},q={class:"zip"},M={key:1,class:"messages"},B="Enter a 5 or 9 digit zip code.",b="Incomplete address.",F=((n,a)=>{const o=n.__vccOpts||n;for(const[m,s]of a)o[m]=s;return o})(e.defineComponent({__name:"USAddress",props:{id:{},address:{},required:{type:Boolean,default:!0},messageScope:{default:"fieldset"},messages:{},showAddress2:{type:Boolean,default:!0}},setup(n){const a=n,o={placeholder:{address1:"Address Line 1",address2:"Address Line 2",city:"City",zip:"00000-0000"},fieldset:{error:{required:"Required fields are missing.",zip:B},hint:{address:"Enter address information."}},field:{error:{address1:"Required",address2:"",city:"Required",state:"Required",zip:B},hint:{address1:"Enter address line 1.",address2:"Optional",city:"",state:"",zip:B}}},m=d=>({placeholder:{address1:d?.placeholder?.address1??o.placeholder.address1,address2:d?.placeholder?.address2??o.placeholder.address2,city:d?.placeholder?.city??o.placeholder.city,zip:d?.placeholder?.zip??o.placeholder.zip},fieldset:{error:{required:d?.fieldset?.error?.required??o.fieldset.error.required,zip:d?.fieldset?.error?.zip??o.fieldset.error.zip},hint:{address:d?.fieldset?.hint?.address??o.fieldset.hint.address}},field:{error:{address1:d?.field?.error?.address1??o.field.error.address1,address2:d?.field?.error?.address2??o.field.error.address2,city:d?.field?.error?.city??o.field.error.city,state:d?.field?.error?.state??o.field.error.state,zip:d?.field?.error?.zip??o.field.error.zip},hint:{address1:d?.field?.hint?.address1??o.field.hint.address1,address2:d?.field?.hint?.address2??o.field.hint.address2,city:d?.field?.hint?.city??o.field.hint.city,state:d?.field?.hint?.state??o.field.hint.state,zip:d?.field?.hint?.zip??o.field.hint.zip}}}),s=e.computed(()=>m(a.messages)),f=e.computed(()=>a.messageScope==="field"),k=e.computed(()=>a.messageScope==="fieldset"),c=e.computed(()=>a.required),v=e.computed(()=>c.value),r=e.computed(()=>({address1:`${a.id}-address1`,address2:`${a.id}-address2`,city:`${a.id}-city`,state:`${a.id}-state`,zip:`${a.id}-zip`})),t=e.computed(()=>a.address),u=e.computed(()=>t.value.address1Valid.value&&t.value.cityValid.value&&t.value.stateValid.value),g=e.computed(()=>t.value.formData.address1.trim()!==""||t.value.formData.address2.trim()!==""||t.value.formData.city.trim()!==""||(t.value.formData.state??"").trim()!==""||t.value.formData.zip.replace(/\D/g,"")!==""),I=e.computed(()=>{if(t.value.optionalZipInvalid)return t.value.optionalZipInvalid.value;const d=t.value.formData.zip.replace(/\D/g,"");return!c.value&&g.value&&d.length!==5&&d.length!==9}),l=e.computed(()=>t.value.optionalPartialInvalid?t.value.optionalPartialInvalid.value:!c.value&&g.value&&!t.value.addressValid.value),i=e.computed(()=>c.value||!l.value?!1:t.value.optionalFeedbackActive?t.value.optionalFeedbackActive.value:!1),h=e.computed(()=>v.value&&!t.value.address1Valid.value||i.value&&t.value.formData.address1.trim()===""),T=e.computed(()=>v.value&&!t.value.cityValid.value||i.value&&t.value.formData.city.trim()===""),V=e.computed(()=>v.value&&!t.value.stateValid.value||i.value&&(t.value.formData.state??"").trim()===""),D=e.computed(()=>v.value&&!t.value.zipValid.value||i.value&&I.value),C=e.computed(()=>c.value?t.value.addressValidate.value:i.value),R=e.computed(()=>c.value?t.value.address1Valid.value:!h.value),$=e.computed(()=>c.value?t.value.cityValid.value:!T.value),Z=e.computed(()=>c.value?t.value.stateValid.value:!V.value),j=e.computed(()=>c.value?t.value.zipValid.value:!D.value),H=e.computed(()=>{const d=s.value.placeholder.address2;return k.value&&c.value?`${d} (Optional)`:d}),U=e.computed(()=>{const d=[];return u.value||d.push(s.value.fieldset.error.required),t.value.zipValid.value||d.push(s.value.fieldset.error.zip),d.join(" ")}),G=e.computed(()=>{const d=[b];return I.value&&d.push(s.value.fieldset.error.zip),d.join(" ")});return(d,J)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["fkui-us-address",{"fkui-us-address--fieldset-scope":k.value}])},[e.createElementVNode("div",z,[e.createVNode(e.unref(S.TextBox),{id:r.value.address1,placeholder:s.value.placeholder.address1,value:t.value.formData.address1,valid:R.value,validate:C.value,validityStyles:C.value,onInput:t.value.onAddress1Input},null,8,["id","placeholder","value","valid","validate","validityStyles","onInput"]),f.value?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[h.value?(e.openBlock(),e.createBlock(e.unref(y.Error),{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.value.field.error.address1),1)]),_:1})):(e.openBlock(),e.createBlock(e.unref(y.Hint),{key:1},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.value.field.hint.address1),1)]),_:1}))],64)):e.createCommentVNode("",!0)]),d.showAddress2?(e.openBlock(),e.createElementBlock("div",x,[e.createVNode(e.unref(S.TextBox),{id:r.value.address2,placeholder:H.value,value:t.value.formData.address2,onInput:t.value.onAddress2Input},null,8,["id","placeholder","value","onInput"]),f.value?(e.openBlock(),e.createBlock(e.unref(y.Hint),{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.value.field.hint.address2),1)]),_:1})):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0),e.createElementVNode("div",A,[e.createVNode(e.unref(S.TextBox),{id:r.value.city,placeholder:s.value.placeholder.city,value:t.value.formData.city,valid:$.value,validate:C.value,validityStyles:C.value,onInput:t.value.onCityInput},null,8,["id","placeholder","value","valid","validate","validityStyles","onInput"]),f.value&&T.value?(e.openBlock(),e.createBlock(e.unref(y.Error),{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.value.field.error.city),1)]),_:1})):e.createCommentVNode("",!0)]),e.createElementVNode("div",N,[e.createVNode(e.unref(_.DropDownList),{id:r.value.state,value:t.value.formData.state,onChange:t.value.onStateChange,defaultItem:t.value.stateDefaultItem,dataItems:t.value.stateOptions,textField:"label",valueField:"value",dataItemKey:"value",valuePrimitive:!0,valid:Z.value,validate:C.value,validityStyles:C.value},null,8,["id","value","onChange","defaultItem","dataItems","valid","validate","validityStyles"]),f.value&&V.value?(e.openBlock(),e.createBlock(e.unref(y.Error),{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.value.field.error.state),1)]),_:1})):e.createCommentVNode("",!0)]),e.createElementVNode("div",q,[e.createVNode(e.unref(S.TextBox),{id:r.value.zip,placeholder:s.value.placeholder.zip,wrapperClass:t.value.zipWrapperClass,value:t.value.zipDisplay.value,onInput:t.value.onZipInput,valid:j.value,validate:C.value,validityStyles:C.value,style:{width:"100%"}},null,8,["id","placeholder","wrapperClass","value","onInput","valid","validate","validityStyles"]),f.value&&D.value?(e.openBlock(),e.createBlock(e.unref(y.Error),{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.value.field.error.zip),1)]),_:1})):e.createCommentVNode("",!0),f.value&&!D.value?(e.openBlock(),e.createBlock(e.unref(y.Hint),{key:1},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.value.field.hint.zip),1)]),_:1})):e.createCommentVNode("",!0)]),k.value?(e.openBlock(),e.createElementBlock("div",M,[v.value&&!t.value.addressValid.value?(e.openBlock(),e.createBlock(e.unref(y.Error),{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(U.value),1)]),_:1})):i.value?(e.openBlock(),e.createBlock(e.unref(y.Error),{key:1},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(G.value),1)]),_:1})):(e.openBlock(),e.createBlock(e.unref(y.Hint),{key:2},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.value.fieldset.hint.address),1)]),_:1}))])):e.createCommentVNode("",!0)],2))}}),[["__scopeId","data-v-8aeb035b"]]),K=["id","colspan","aria-colindex","aria-selected","data-grid-col-index"],P=e.defineComponent({inheritAttrs:!1,__name:"ActionCell",props:{id:{},className:{},style:{},colSpan:{},ariaColumnIndex:{},isSelected:{type:Boolean},columnIndex:{},dataItem:{},config:{},menuController:{},tabIndex:{default:-1}},setup(n){const a=n,o=w.useCompositeId("action-cell"),m=r=>a.menuController.getTriggerId(r,a.dataItem),s=r=>a.menuController.registry.isIdActive(m(r)),f=r=>typeof r.items=="function",k=(r,t)=>{a.menuController.registry.register(m(r),t)},c=r=>{if(!f(r)){a.menuController.handleDirectAction?.(r,a.dataItem);return}a.menuController.handleTriggerClick(m(r))},v=(r,...t)=>{f(r)&&a.menuController.handleTriggerKeydown(m(r),...t)};return(r,t)=>(e.openBlock(),e.createElementBlock("td",{id:r.id??e.unref(o).instanceId,class:e.normalizeClass(["fkui-action-cell","k-table-td",r.className]),style:e.normalizeStyle(r.style),colspan:r.colSpan,role:"gridcell","aria-colindex":r.ariaColumnIndex,"aria-selected":r.isSelected,"data-grid-col-index":r.columnIndex},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.config.triggers,u=>(e.openBlock(),e.createBlock(e.unref(E.Button),{key:u.key,ref_for:!0,ref:f(u)?g=>k(u,g):void 0,id:e.unref(o).compose(u.key,"trigger"),"svg-icon":u.icon,type:"button","fill-mode":"flat","theme-color":"primary",rounded:"full","aria-label":u.ariaLabel,"aria-haspopup":f(u)?"menu":void 0,"aria-expanded":f(u)?s(u):void 0,disabled:u.disabled?.(r.dataItem),tabindex:r.tabIndex,onClick:g=>c(u),onKeydown:g=>v(u,g)},null,8,["id","svg-icon","aria-label","aria-haspopup","aria-expanded","disabled","tabindex","onClick","onKeydown"]))),128))],14,K))}}),O=n=>{const a=w.useActiveIdRegistry();n.group?.register(a);const o=n.getTriggerId??((l,i)=>`${l.key}:${n.getRowId(i)}`),m=e.computed(()=>{const l=a.activeId.value?.split(":")[0];return n.config.triggers.find(i=>i.key===l)??null}),s=e.computed(()=>{const l=a.activeId.value?.split(":").slice(1).join(":");return l===void 0?null:e.toValue(n.rows).find(i=>String(n.getRowId(i))===l)??null}),f=e.computed(()=>{const l=s.value,i=m.value;return l&&i?i.items?.(l)??[]:[]}),k=e.computed(()=>{const l=s.value,i=m.value;return l&&i&&typeof i.items=="function"&&i.title?i.title(l):null}),c=w.usePopupMenu({isOpen:a.isActive,triggerRef:a.activeElement,menuRef:n.menuRef,triggerMode:n.triggerMode??"button",anchor:n.anchor??!0,resolveFocusTarget:n.resolveFocusTarget,focusTargetContainerSelector:n.focusTargetContainerSelector,requestShow:l=>{typeof l=="string"&&a.activate(l)},requestHide:()=>a.deactivate(),menuLabel:k});let v=0;const r=l=>{const i=++v;if(n.group?.deactivateOthers(a),a.isActive.value&&!a.isIdActive(l)){a.deactivate(),e.nextTick(()=>{i===v&&c.handleTriggerClick(l)});return}c.handleTriggerClick(l)},t=(l,i)=>{v++,n.group?.deactivateOthers(a),a.deactivate(),n.onActionSelected(void 0,i,l)},u=(l,...i)=>{const h=i[0];if(h.key==="Enter"||h.code==="Space"){h.preventDefault(),r(l);return}c.handleTriggerKeydown(h,l)},g=l=>{l.key==="Escape"&&c.handleMenuEscape(l)},I=l=>{const i=s.value,h=m.value;c.handleMenuSelect(l,()=>{i&&h&&n.onActionSelected(l.item,i,h)})};return{actionCellProps:{config:n.config,menuController:{registry:a,getTriggerId:o,handleTriggerClick:r,handleDirectAction:t,handleTriggerKeydown:u}},popupProps:e.computed(()=>({show:a.isActive.value,offset:c.offset.value,onClose:c.handlePopupClose})),menuProps:e.computed(()=>({items:f.value,vertical:!0,onKeydown:g,onSelect:I})),activeRow:s,activeTrigger:m,activeTitle:k}};p.ActionCell=P,p.USAddress=F,p.useActionCellMenu=O,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})}));
2
2
  //# sourceMappingURL=featherk-ui.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"featherk-ui.umd.js","sources":["../src/address/USAddress.vue","../src/table/ActionCell.vue","../src/table/useActionCellMenu.ts"],"sourcesContent":["<template>\n <div\n class=\"fkui-us-address\"\n :class=\"{ 'fkui-us-address--fieldset-scope': fieldsetScope }\"\n >\n <div class=\"address1\">\n <TextBox\n :id=\"fieldIds.address1\"\n :placeholder=\"resolvedMessages.placeholder.address1\"\n :value=\"address.formData.address1\"\n :valid=\"address1DisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onAddress1Input\"\n />\n <template v-if=\"fieldScope\">\n <Error v-if=\"showAddress1Error\">\n {{ resolvedMessages.field.error.address1 }}\n </Error>\n <Hint v-else>{{ resolvedMessages.field.hint.address1 }}</Hint>\n </template>\n </div>\n\n <div v-if=\"showAddress2\" class=\"address2\">\n <TextBox\n :id=\"fieldIds.address2\"\n :placeholder=\"address2PlaceholderDisplay\"\n :value=\"address.formData.address2\"\n @input=\"address.onAddress2Input\"\n />\n <Hint v-if=\"fieldScope\">{{ resolvedMessages.field.hint.address2 }}</Hint>\n </div>\n\n <div class=\"city\">\n <TextBox\n :id=\"fieldIds.city\"\n :placeholder=\"resolvedMessages.placeholder.city\"\n :value=\"address.formData.city\"\n :valid=\"cityDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onCityInput\"\n />\n <Error v-if=\"fieldScope && showCityError\">\n {{ resolvedMessages.field.error.city }}\n </Error>\n </div>\n\n <div class=\"state\">\n <DropDownList\n :id=\"fieldIds.state\"\n :value=\"address.formData.state\"\n @change=\"address.onStateChange\"\n :defaultItem=\"address.stateDefaultItem\"\n :dataItems=\"address.stateOptions\"\n textField=\"label\"\n valueField=\"value\"\n dataItemKey=\"value\"\n :valuePrimitive=\"true\"\n :valid=\"stateDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n />\n <Error v-if=\"fieldScope && showStateError\">\n {{ resolvedMessages.field.error.state }}\n </Error>\n </div>\n\n <div class=\"zip\">\n <TextBox\n :id=\"fieldIds.zip\"\n :placeholder=\"resolvedMessages.placeholder.zip\"\n :wrapperClass=\"address.zipWrapperClass\"\n :value=\"address.zipDisplay.value\"\n @input=\"address.onZipInput\"\n :valid=\"zipDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n :style=\"{ width: '100%' }\"\n />\n <Error v-if=\"fieldScope && showZipError\">\n {{ resolvedMessages.field.error.zip }}\n </Error>\n <Hint v-if=\"fieldScope && !showZipError\">\n {{ resolvedMessages.field.hint.zip }}\n </Hint>\n </div>\n\n <div v-if=\"fieldsetScope\" class=\"messages\">\n <Error v-if=\"showErrors && !address.addressValid.value\">\n {{ fieldsetErrorMessage }}\n </Error>\n <Error v-else-if=\"showOptionalFeedback\">\n {{ optionalFieldsetErrorMessage }}\n </Error>\n <Hint v-else>{{ resolvedMessages.fieldset.hint.address }}</Hint>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { Error, Hint } from \"@progress/kendo-vue-labels\";\nimport { TextBox } from \"@progress/kendo-vue-inputs\";\nimport { DropDownList } from \"@progress/kendo-vue-dropdowns\";\nimport type {\n USAddressMessageScope,\n USAddressMessages,\n USAddressViewModel,\n} from \"./types\";\n\nconst props = withDefaults(\n defineProps<{\n id: string;\n address: USAddressViewModel;\n required?: boolean;\n messageScope?: USAddressMessageScope;\n messages?: USAddressMessages;\n showAddress2?: boolean;\n }>(),\n {\n required: true,\n messageScope: \"fieldset\",\n showAddress2: true,\n },\n);\n\nconst ZIP_CODE_MESSAGE = \"Enter a 5 or 9 digit zip code.\";\nconst OPTIONAL_FIELDS_MESSAGE = \"Incomplete address.\";\n\ntype USAddressResolvedMessages = {\n placeholder: {\n address1: string;\n address2: string;\n city: string;\n zip: string;\n };\n fieldset: {\n error: {\n required: string;\n zip: string;\n };\n hint: {\n address: string;\n };\n };\n field: {\n error: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n hint: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n };\n};\n\nconst DEFAULT_MESSAGES: USAddressResolvedMessages = {\n placeholder: {\n address1: \"Address Line 1\",\n address2: \"Address Line 2\",\n city: \"City\",\n zip: \"00000-0000\",\n },\n fieldset: {\n error: {\n required: \"Required fields are missing.\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address: \"Enter address information.\",\n },\n },\n field: {\n error: {\n address1: \"Required\",\n address2: \"\",\n city: \"Required\",\n state: \"Required\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address1: \"Enter address line 1.\",\n address2: \"Optional\",\n city: \"\",\n state: \"\",\n zip: ZIP_CODE_MESSAGE,\n },\n },\n};\n\nconst resolveMessages = (\n source?: USAddressMessages,\n): USAddressResolvedMessages => {\n return {\n placeholder: {\n address1:\n source?.placeholder?.address1 ?? DEFAULT_MESSAGES.placeholder.address1,\n address2:\n source?.placeholder?.address2 ?? DEFAULT_MESSAGES.placeholder.address2,\n city: source?.placeholder?.city ?? DEFAULT_MESSAGES.placeholder.city,\n zip: source?.placeholder?.zip ?? DEFAULT_MESSAGES.placeholder.zip,\n },\n fieldset: {\n error: {\n required:\n source?.fieldset?.error?.required ??\n DEFAULT_MESSAGES.fieldset.error.required,\n zip:\n source?.fieldset?.error?.zip ?? DEFAULT_MESSAGES.fieldset.error.zip,\n },\n hint: {\n address:\n source?.fieldset?.hint?.address ??\n DEFAULT_MESSAGES.fieldset.hint.address,\n },\n },\n field: {\n error: {\n address1:\n source?.field?.error?.address1 ??\n DEFAULT_MESSAGES.field.error.address1,\n address2:\n source?.field?.error?.address2 ??\n DEFAULT_MESSAGES.field.error.address2,\n city: source?.field?.error?.city ?? DEFAULT_MESSAGES.field.error.city,\n state:\n source?.field?.error?.state ?? DEFAULT_MESSAGES.field.error.state,\n zip: source?.field?.error?.zip ?? DEFAULT_MESSAGES.field.error.zip,\n },\n hint: {\n address1:\n source?.field?.hint?.address1 ?? DEFAULT_MESSAGES.field.hint.address1,\n address2:\n source?.field?.hint?.address2 ?? DEFAULT_MESSAGES.field.hint.address2,\n city: source?.field?.hint?.city ?? DEFAULT_MESSAGES.field.hint.city,\n state: source?.field?.hint?.state ?? DEFAULT_MESSAGES.field.hint.state,\n zip: source?.field?.hint?.zip ?? DEFAULT_MESSAGES.field.hint.zip,\n },\n },\n };\n};\n\nconst resolvedMessages = computed(() => resolveMessages(props.messages));\n\nconst fieldScope = computed(() => {\n return props.messageScope === \"field\";\n});\n\nconst fieldsetScope = computed(() => {\n return props.messageScope === \"fieldset\";\n});\n\nconst isRequired = computed(() => props.required);\n\nconst showErrors = computed(() => isRequired.value);\n\nconst fieldIds = computed(() => ({\n address1: `${props.id}-address1`,\n address2: `${props.id}-address2`,\n city: `${props.id}-city`,\n state: `${props.id}-state`,\n zip: `${props.id}-zip`,\n}));\n\nconst address = computed(() => props.address);\n\nconst nonZipRequiredFieldsValid = computed(() => {\n return (\n address.value.address1Valid.value &&\n address.value.cityValid.value &&\n address.value.stateValid.value\n );\n});\n\nconst hasAnyOptionalInput = computed(() => {\n return (\n address.value.formData.address1.trim() !== \"\" ||\n address.value.formData.address2.trim() !== \"\" ||\n address.value.formData.city.trim() !== \"\" ||\n (address.value.formData.state ?? \"\").trim() !== \"\" ||\n address.value.formData.zip.replace(/\\D/g, \"\") !== \"\"\n );\n});\n\nconst optionalZipInvalid = computed(() => {\n if (address.value.optionalZipInvalid) {\n return address.value.optionalZipInvalid.value;\n }\n\n const zipDigits = address.value.formData.zip.replace(/\\D/g, \"\");\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n zipDigits.length !== 5 &&\n zipDigits.length !== 9\n );\n});\n\nconst optionalPartialInvalid = computed(() => {\n if (address.value.optionalPartialInvalid) {\n return address.value.optionalPartialInvalid.value;\n }\n\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n !address.value.addressValid.value\n );\n});\n\nconst showOptionalFeedback = computed(() => {\n if (isRequired.value || !optionalPartialInvalid.value) {\n return false;\n }\n\n if (address.value.optionalFeedbackActive) {\n return address.value.optionalFeedbackActive.value;\n }\n\n return false;\n});\n\nconst showAddress1Error = computed(() => {\n return (\n (showErrors.value && !address.value.address1Valid.value) ||\n (showOptionalFeedback.value &&\n address.value.formData.address1.trim() === \"\")\n );\n});\n\nconst showCityError = computed(() => {\n return (\n (showErrors.value && !address.value.cityValid.value) ||\n (showOptionalFeedback.value && address.value.formData.city.trim() === \"\")\n );\n});\n\nconst showStateError = computed(() => {\n return (\n (showErrors.value && !address.value.stateValid.value) ||\n (showOptionalFeedback.value &&\n (address.value.formData.state ?? \"\").trim() === \"\")\n );\n});\n\nconst showZipError = computed(() => {\n return (\n (showErrors.value && !address.value.zipValid.value) ||\n (showOptionalFeedback.value && optionalZipInvalid.value)\n );\n});\n\nconst validationStylesActive = computed(() => {\n return isRequired.value\n ? address.value.addressValidate.value\n : showOptionalFeedback.value;\n});\n\nconst address1DisplayValid = computed(() => {\n return isRequired.value\n ? address.value.address1Valid.value\n : !showAddress1Error.value;\n});\n\nconst cityDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.cityValid.value\n : !showCityError.value;\n});\n\nconst stateDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.stateValid.value\n : !showStateError.value;\n});\n\nconst zipDisplayValid = computed(() => {\n return isRequired.value ? address.value.zipValid.value : !showZipError.value;\n});\n\nconst address2PlaceholderDisplay = computed(() => {\n const basePlaceholder = resolvedMessages.value.placeholder.address2;\n\n if (fieldsetScope.value && isRequired.value) {\n return `${basePlaceholder} (Optional)`;\n }\n return basePlaceholder;\n});\n\nconst fieldsetErrorMessage = computed(() => {\n const messages: string[] = [];\n\n if (!nonZipRequiredFieldsValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.required);\n }\n\n if (!address.value.zipValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n\nconst optionalFieldsetErrorMessage = computed(() => {\n const messages: string[] = [OPTIONAL_FIELDS_MESSAGE];\n\n if (optionalZipInvalid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n</script>\n\n<style scoped>\n.fkui-us-address {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr;\n grid-template-areas:\n \"address1 address1 address1\"\n \"address2 address2 address2\"\n \"city state zip\"\n \"messages messages messages\";\n gap: 0.75rem;\n margin-bottom: 1rem;\n\n .address1 {\n grid-area: address1;\n }\n\n .address2 {\n grid-area: address2;\n }\n\n .city {\n grid-area: city;\n }\n\n .state {\n grid-area: state;\n }\n\n .zip {\n grid-area: zip;\n }\n\n .messages {\n grid-area: messages;\n }\n\n :deep(.fk-zip-textbox) {\n min-width: 100%;\n }\n}\n\n.fkui-us-address--fieldset-scope {\n row-gap: 0.5rem;\n\n .messages {\n margin-top: -0.375rem;\n }\n}\n</style>\n","<template>\n <td\n :id=\"id ?? ids.instanceId\"\n :class=\"['fkui-action-cell', 'k-table-td', className]\"\n :style=\"style\"\n :colspan=\"colSpan\"\n role=\"gridcell\"\n :aria-colindex=\"ariaColumnIndex\"\n :aria-selected=\"isSelected\"\n :data-grid-col-index=\"columnIndex\"\n >\n <Button\n v-for=\"trigger in config.triggers\"\n :key=\"trigger.key\"\n :ref=\"\n hasMenu(trigger)\n ? (element) => registerTrigger(trigger, element)\n : undefined\n \"\n :id=\"ids.compose(trigger.key, 'trigger')\"\n :svg-icon=\"trigger.icon\"\n type=\"button\"\n fill-mode=\"flat\"\n theme-color=\"primary\"\n rounded=\"full\"\n :aria-label=\"trigger.ariaLabel\"\n :aria-haspopup=\"hasMenu(trigger) ? 'menu' : undefined\"\n :aria-expanded=\"hasMenu(trigger) ? isTriggerActive(trigger) : undefined\"\n :disabled=\"trigger.disabled?.(dataItem)\"\n :tabindex=\"tabIndex\"\n @click=\"onTriggerClick(trigger)\"\n @keydown=\"onTriggerKeydown(trigger, $event)\"\n />\n </td>\n</template>\n\n<script setup lang=\"ts\">\nimport type { ComponentPublicInstance } from \"vue\";\nimport { Button } from \"@progress/kendo-vue-buttons\";\nimport type { GridCellProps } from \"@progress/kendo-vue-grid\";\nimport {\n useCompositeId,\n type RegisterableElement,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellMenuController,\n ActionCellTrigger,\n} from \"./types\";\n\ndefineOptions({ inheritAttrs: false });\n\ntype ActionCellProps = Partial<\n Pick<\n GridCellProps,\n | \"id\"\n | \"className\"\n | \"style\"\n | \"colSpan\"\n | \"ariaColumnIndex\"\n | \"isSelected\"\n | \"columnIndex\"\n >\n> & {\n dataItem: any;\n config: ActionCellConfig<any>;\n menuController: ActionCellMenuController<any>;\n tabIndex?: number;\n};\n\nconst props = withDefaults(defineProps<ActionCellProps>(), {\n tabIndex: -1,\n});\n\nconst ids = useCompositeId(\"action-cell\");\n\nconst getTriggerId = (trigger: ActionCellTrigger<any>) =>\n props.menuController.getTriggerId(trigger, props.dataItem);\n\nconst isTriggerActive = (trigger: ActionCellTrigger<any>) =>\n props.menuController.registry.isIdActive(getTriggerId(trigger));\n\nconst hasMenu = (trigger: ActionCellTrigger<any>) =>\n typeof trigger.items === \"function\";\n\nconst registerTrigger = (\n trigger: ActionCellTrigger<any>,\n element: Element | ComponentPublicInstance | null,\n) => {\n props.menuController.registry.register(\n getTriggerId(trigger),\n element as RegisterableElement,\n );\n};\n\nconst onTriggerClick = (trigger: ActionCellTrigger<any>) => {\n if (!hasMenu(trigger)) {\n props.menuController.handleDirectAction?.(trigger, props.dataItem);\n return;\n }\n props.menuController.handleTriggerClick(getTriggerId(trigger));\n};\n\nconst onTriggerKeydown = (\n trigger: ActionCellTrigger<any>,\n ...args: unknown[]\n) => {\n if (!hasMenu(trigger)) return;\n props.menuController.handleTriggerKeydown(getTriggerId(trigger), ...args);\n};\n</script>\n","import {\n computed,\n toValue,\n type ComputedRef,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport {\n useActiveIdRegistry,\n usePopupMenu,\n type KendoMenuSelectEvent,\n type PopupMenuAnchorOptions,\n type PopupMenuElementRef,\n type PopupMenuOffset,\n type PopupMenuTriggerMode,\n type UseExclusiveGroupReturn,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellDataItem,\n ActionCellMenuController,\n ActionCellMenuItem,\n} from \"./types\";\n\nexport type UseActionCellMenuOptions<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Repeatable trigger configuration, rendered by every `ActionCell` instance. */\n config: TConfig;\n /** All rows currently rendered; used to resolve the active row from its registry id. */\n rows: MaybeRefOrGetter<TData[]>;\n /** Derives a stable row id used to build the default registry id for each trigger. */\n getRowId: (row: TData) => string | number;\n /**\n * Overrides the registry ID formatting while preserving `<trigger.key>:<rowId>` semantics.\n * Active row and trigger resolution parse the first colon-separated segment as the trigger\n * key and the remaining segments as the row ID.\n */\n getTriggerId?: (trigger: TConfig[\"triggers\"][number], row: TData) => string;\n /** Ref to the single shared Kendo Menu instance. */\n menuRef: PopupMenuElementRef;\n /** Forwarded to `usePopupMenu`. Defaults to `\"button\"`. */\n triggerMode?: PopupMenuTriggerMode;\n /** Forwarded to `usePopupMenu`. Defaults to `true` for shared-popup positioning. */\n anchor?: PopupMenuAnchorOptions | true;\n /** Forwarded to `usePopupMenu`. */\n resolveFocusTarget?: () => HTMLElement | null;\n /** Coordinates mutual exclusivity with other active-id registries in this group. */\n group?: UseExclusiveGroupReturn;\n /**\n * Runs after a menu item is selected, with its original item and resolved row/trigger.\n * Direct-action triggers have no menu item and pass `undefined`.\n */\n onActionSelected: (\n item: ActionCellMenuItem | undefined,\n row: TData,\n trigger: TConfig[\"triggers\"][number],\n ) => void;\n};\n\nexport type UseActionCellMenuReturn<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Spread onto every `<ActionCell>` instance. */\n actionCellProps: {\n config: TConfig;\n menuController: ActionCellMenuController<TData>;\n };\n /** Spread onto the single shared `<Popup>`. */\n popupProps: ComputedRef<{\n show: boolean;\n offset: PopupMenuOffset;\n onClose: () => void;\n }>;\n /** Spread onto the single shared Kendo `<Menu>`. */\n menuProps: ComputedRef<{\n items: ActionCellMenuItem[];\n vertical: true;\n onKeydown: (event: KeyboardEvent) => void;\n onSelect: (event: KendoMenuSelectEvent<ActionCellMenuItem>) => void;\n }>;\n /** Row resolved from the currently active trigger id, if any. */\n activeRow: ComputedRef<TData | null>;\n /** Trigger config resolved from the currently active trigger id, if any. */\n activeTrigger: ComputedRef<TConfig[\"triggers\"][number] | null>;\n /** Resolved `trigger.title(activeRow)`, or `null` when unset/no trigger is active. Render this yourself (e.g. `<strong>`) above the `<Menu>` — it is not part of `menuProps.items`. */\n activeTitle: ComputedRef<string | null>;\n};\n\n/**\n * Bundles the shared-popup wiring a parent needs to drive `ActionCell`: one\n * `useActiveIdRegistry`, one `usePopupMenu`, and the derived active\n * row/trigger/menu items. The parent still owns the `<Popup>`/`<Menu>`\n * template elements and any business logic for the selected action.\n */\nexport const useActionCellMenu = <\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n>(\n options: UseActionCellMenuOptions<TData, TConfig>,\n): UseActionCellMenuReturn<TData, TConfig> => {\n const registry = useActiveIdRegistry<string>();\n options.group?.register(registry);\n\n const getTriggerId =\n options.getTriggerId ??\n ((trigger: TConfig[\"triggers\"][number], row: TData) =>\n `${trigger.key}:${options.getRowId(row)}`);\n\n const activeTrigger = computed(() => {\n const key = registry.activeId.value?.split(\":\")[0];\n return (\n (options.config.triggers.find((trigger) => trigger.key === key) as\n | TConfig[\"triggers\"][number]\n | undefined) ?? null\n );\n });\n\n const activeRow = computed(() => {\n const rowId = registry.activeId.value?.split(\":\").slice(1).join(\":\");\n if (rowId === undefined) return null;\n return (\n toValue(options.rows).find(\n (row) => String(options.getRowId(row)) === rowId,\n ) ?? null\n );\n });\n\n const activeMenuItems = computed<ActionCellMenuItem[]>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row && trigger ? (trigger.items?.(row) ?? []) : [];\n });\n\n const activeTitle = computed<string | null>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row &&\n trigger &&\n typeof trigger.items === \"function\" &&\n trigger.title\n ? trigger.title(row)\n : null;\n });\n\n const popupMenu = usePopupMenu({\n isOpen: registry.isActive,\n triggerRef: registry.activeElement,\n menuRef: options.menuRef,\n triggerMode: options.triggerMode ?? \"button\",\n anchor: options.anchor ?? true,\n resolveFocusTarget: options.resolveFocusTarget,\n requestShow: (id) => {\n if (typeof id === \"string\") registry.activate(id);\n },\n requestHide: () => registry.deactivate(),\n menuLabel: activeTitle,\n });\n\n const handleTriggerClick = (id: string) => {\n if (registry.isActive.value && !registry.isIdActive(id)) {\n registry.deactivate();\n }\n options.group?.deactivateOthers(registry);\n popupMenu.handleActionButtonClick(id);\n };\n\n const handleDirectAction = (\n trigger: TConfig[\"triggers\"][number],\n row: TData,\n ) => {\n options.group?.deactivateOthers(registry);\n registry.deactivate();\n options.onActionSelected(undefined, row, trigger);\n };\n\n const handleTriggerKeydown = (id: string, ...args: unknown[]) => {\n const event = args[0] as KeyboardEvent;\n if (event.key === \"Enter\" || event.code === \"Space\") {\n event.preventDefault();\n handleTriggerClick(id);\n return;\n }\n popupMenu.handleActionButtonKeydown(event, id);\n };\n\n const onMenuKeydown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") popupMenu.handleActionMenuEscape(event);\n };\n\n const onMenuSelect = (event: KendoMenuSelectEvent<ActionCellMenuItem>) => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n popupMenu.handleMenuSelect(event, () => {\n if (row && trigger) {\n options.onActionSelected(event.item, row, trigger);\n }\n });\n };\n\n return {\n actionCellProps: {\n config: options.config,\n menuController: {\n registry,\n getTriggerId,\n handleTriggerClick,\n handleDirectAction,\n handleTriggerKeydown,\n },\n },\n popupProps: computed(() => ({\n show: registry.isActive.value,\n offset: popupMenu.offset.value,\n onClose: popupMenu.handlePopupClose,\n })),\n menuProps: computed(() => ({\n items: activeMenuItems.value,\n vertical: true as const,\n onKeydown: onMenuKeydown,\n onSelect: onMenuSelect,\n })),\n activeRow,\n activeTrigger,\n activeTitle,\n };\n};\n"],"names":["ZIP_CODE_MESSAGE","OPTIONAL_FIELDS_MESSAGE","props","__props","DEFAULT_MESSAGES","resolveMessages","source","resolvedMessages","computed","fieldScope","fieldsetScope","isRequired","showErrors","fieldIds","address","nonZipRequiredFieldsValid","hasAnyOptionalInput","optionalZipInvalid","zipDigits","optionalPartialInvalid","showOptionalFeedback","showAddress1Error","showCityError","showStateError","showZipError","validationStylesActive","address1DisplayValid","cityDisplayValid","stateDisplayValid","zipDisplayValid","address2PlaceholderDisplay","basePlaceholder","fieldsetErrorMessage","messages","optionalFieldsetErrorMessage","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_createVNode","_unref","TextBox","_Fragment","_createBlock","Error","_createTextVNode","_toDisplayString","Hint","showAddress2","_openBlock","_hoisted_2","_hoisted_3","_hoisted_4","DropDownList","_hoisted_5","_hoisted_6","ids","useCompositeId","getTriggerId","trigger","isTriggerActive","hasMenu","registerTrigger","element","onTriggerClick","onTriggerKeydown","args","id","className","style","colSpan","ariaColumnIndex","isSelected","columnIndex","_renderList","config","Button","dataItem","tabIndex","$event","useActionCellMenu","options","registry","useActiveIdRegistry","row","activeTrigger","key","activeRow","rowId","toValue","activeMenuItems","activeTitle","popupMenu","usePopupMenu","handleTriggerClick","handleDirectAction","handleTriggerKeydown","event","onMenuKeydown","onMenuSelect"],"mappings":"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"}
1
+ {"version":3,"file":"featherk-ui.umd.js","sources":["../src/address/USAddress.vue","../src/table/ActionCell.vue","../src/table/useActionCellMenu.ts"],"sourcesContent":["<template>\n <div\n class=\"fkui-us-address\"\n :class=\"{ 'fkui-us-address--fieldset-scope': fieldsetScope }\"\n >\n <div class=\"address1\">\n <TextBox\n :id=\"fieldIds.address1\"\n :placeholder=\"resolvedMessages.placeholder.address1\"\n :value=\"address.formData.address1\"\n :valid=\"address1DisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onAddress1Input\"\n />\n <template v-if=\"fieldScope\">\n <Error v-if=\"showAddress1Error\">\n {{ resolvedMessages.field.error.address1 }}\n </Error>\n <Hint v-else>{{ resolvedMessages.field.hint.address1 }}</Hint>\n </template>\n </div>\n\n <div v-if=\"showAddress2\" class=\"address2\">\n <TextBox\n :id=\"fieldIds.address2\"\n :placeholder=\"address2PlaceholderDisplay\"\n :value=\"address.formData.address2\"\n @input=\"address.onAddress2Input\"\n />\n <Hint v-if=\"fieldScope\">{{ resolvedMessages.field.hint.address2 }}</Hint>\n </div>\n\n <div class=\"city\">\n <TextBox\n :id=\"fieldIds.city\"\n :placeholder=\"resolvedMessages.placeholder.city\"\n :value=\"address.formData.city\"\n :valid=\"cityDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n @input=\"address.onCityInput\"\n />\n <Error v-if=\"fieldScope && showCityError\">\n {{ resolvedMessages.field.error.city }}\n </Error>\n </div>\n\n <div class=\"state\">\n <DropDownList\n :id=\"fieldIds.state\"\n :value=\"address.formData.state\"\n @change=\"address.onStateChange\"\n :defaultItem=\"address.stateDefaultItem\"\n :dataItems=\"address.stateOptions\"\n textField=\"label\"\n valueField=\"value\"\n dataItemKey=\"value\"\n :valuePrimitive=\"true\"\n :valid=\"stateDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n />\n <Error v-if=\"fieldScope && showStateError\">\n {{ resolvedMessages.field.error.state }}\n </Error>\n </div>\n\n <div class=\"zip\">\n <TextBox\n :id=\"fieldIds.zip\"\n :placeholder=\"resolvedMessages.placeholder.zip\"\n :wrapperClass=\"address.zipWrapperClass\"\n :value=\"address.zipDisplay.value\"\n @input=\"address.onZipInput\"\n :valid=\"zipDisplayValid\"\n :validate=\"validationStylesActive\"\n :validityStyles=\"validationStylesActive\"\n :style=\"{ width: '100%' }\"\n />\n <Error v-if=\"fieldScope && showZipError\">\n {{ resolvedMessages.field.error.zip }}\n </Error>\n <Hint v-if=\"fieldScope && !showZipError\">\n {{ resolvedMessages.field.hint.zip }}\n </Hint>\n </div>\n\n <div v-if=\"fieldsetScope\" class=\"messages\">\n <Error v-if=\"showErrors && !address.addressValid.value\">\n {{ fieldsetErrorMessage }}\n </Error>\n <Error v-else-if=\"showOptionalFeedback\">\n {{ optionalFieldsetErrorMessage }}\n </Error>\n <Hint v-else>{{ resolvedMessages.fieldset.hint.address }}</Hint>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { Error, Hint } from \"@progress/kendo-vue-labels\";\nimport { TextBox } from \"@progress/kendo-vue-inputs\";\nimport { DropDownList } from \"@progress/kendo-vue-dropdowns\";\nimport type {\n USAddressMessageScope,\n USAddressMessages,\n USAddressViewModel,\n} from \"./types\";\n\nconst props = withDefaults(\n defineProps<{\n id: string;\n address: USAddressViewModel;\n required?: boolean;\n messageScope?: USAddressMessageScope;\n messages?: USAddressMessages;\n showAddress2?: boolean;\n }>(),\n {\n required: true,\n messageScope: \"fieldset\",\n showAddress2: true,\n },\n);\n\nconst ZIP_CODE_MESSAGE = \"Enter a 5 or 9 digit zip code.\";\nconst OPTIONAL_FIELDS_MESSAGE = \"Incomplete address.\";\n\ntype USAddressResolvedMessages = {\n placeholder: {\n address1: string;\n address2: string;\n city: string;\n zip: string;\n };\n fieldset: {\n error: {\n required: string;\n zip: string;\n };\n hint: {\n address: string;\n };\n };\n field: {\n error: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n hint: {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n };\n };\n};\n\nconst DEFAULT_MESSAGES: USAddressResolvedMessages = {\n placeholder: {\n address1: \"Address Line 1\",\n address2: \"Address Line 2\",\n city: \"City\",\n zip: \"00000-0000\",\n },\n fieldset: {\n error: {\n required: \"Required fields are missing.\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address: \"Enter address information.\",\n },\n },\n field: {\n error: {\n address1: \"Required\",\n address2: \"\",\n city: \"Required\",\n state: \"Required\",\n zip: ZIP_CODE_MESSAGE,\n },\n hint: {\n address1: \"Enter address line 1.\",\n address2: \"Optional\",\n city: \"\",\n state: \"\",\n zip: ZIP_CODE_MESSAGE,\n },\n },\n};\n\nconst resolveMessages = (\n source?: USAddressMessages,\n): USAddressResolvedMessages => {\n return {\n placeholder: {\n address1:\n source?.placeholder?.address1 ?? DEFAULT_MESSAGES.placeholder.address1,\n address2:\n source?.placeholder?.address2 ?? DEFAULT_MESSAGES.placeholder.address2,\n city: source?.placeholder?.city ?? DEFAULT_MESSAGES.placeholder.city,\n zip: source?.placeholder?.zip ?? DEFAULT_MESSAGES.placeholder.zip,\n },\n fieldset: {\n error: {\n required:\n source?.fieldset?.error?.required ??\n DEFAULT_MESSAGES.fieldset.error.required,\n zip:\n source?.fieldset?.error?.zip ?? DEFAULT_MESSAGES.fieldset.error.zip,\n },\n hint: {\n address:\n source?.fieldset?.hint?.address ??\n DEFAULT_MESSAGES.fieldset.hint.address,\n },\n },\n field: {\n error: {\n address1:\n source?.field?.error?.address1 ??\n DEFAULT_MESSAGES.field.error.address1,\n address2:\n source?.field?.error?.address2 ??\n DEFAULT_MESSAGES.field.error.address2,\n city: source?.field?.error?.city ?? DEFAULT_MESSAGES.field.error.city,\n state:\n source?.field?.error?.state ?? DEFAULT_MESSAGES.field.error.state,\n zip: source?.field?.error?.zip ?? DEFAULT_MESSAGES.field.error.zip,\n },\n hint: {\n address1:\n source?.field?.hint?.address1 ?? DEFAULT_MESSAGES.field.hint.address1,\n address2:\n source?.field?.hint?.address2 ?? DEFAULT_MESSAGES.field.hint.address2,\n city: source?.field?.hint?.city ?? DEFAULT_MESSAGES.field.hint.city,\n state: source?.field?.hint?.state ?? DEFAULT_MESSAGES.field.hint.state,\n zip: source?.field?.hint?.zip ?? DEFAULT_MESSAGES.field.hint.zip,\n },\n },\n };\n};\n\nconst resolvedMessages = computed(() => resolveMessages(props.messages));\n\nconst fieldScope = computed(() => {\n return props.messageScope === \"field\";\n});\n\nconst fieldsetScope = computed(() => {\n return props.messageScope === \"fieldset\";\n});\n\nconst isRequired = computed(() => props.required);\n\nconst showErrors = computed(() => isRequired.value);\n\nconst fieldIds = computed(() => ({\n address1: `${props.id}-address1`,\n address2: `${props.id}-address2`,\n city: `${props.id}-city`,\n state: `${props.id}-state`,\n zip: `${props.id}-zip`,\n}));\n\nconst address = computed(() => props.address);\n\nconst nonZipRequiredFieldsValid = computed(() => {\n return (\n address.value.address1Valid.value &&\n address.value.cityValid.value &&\n address.value.stateValid.value\n );\n});\n\nconst hasAnyOptionalInput = computed(() => {\n return (\n address.value.formData.address1.trim() !== \"\" ||\n address.value.formData.address2.trim() !== \"\" ||\n address.value.formData.city.trim() !== \"\" ||\n (address.value.formData.state ?? \"\").trim() !== \"\" ||\n address.value.formData.zip.replace(/\\D/g, \"\") !== \"\"\n );\n});\n\nconst optionalZipInvalid = computed(() => {\n if (address.value.optionalZipInvalid) {\n return address.value.optionalZipInvalid.value;\n }\n\n const zipDigits = address.value.formData.zip.replace(/\\D/g, \"\");\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n zipDigits.length !== 5 &&\n zipDigits.length !== 9\n );\n});\n\nconst optionalPartialInvalid = computed(() => {\n if (address.value.optionalPartialInvalid) {\n return address.value.optionalPartialInvalid.value;\n }\n\n return (\n !isRequired.value &&\n hasAnyOptionalInput.value &&\n !address.value.addressValid.value\n );\n});\n\nconst showOptionalFeedback = computed(() => {\n if (isRequired.value || !optionalPartialInvalid.value) {\n return false;\n }\n\n if (address.value.optionalFeedbackActive) {\n return address.value.optionalFeedbackActive.value;\n }\n\n return false;\n});\n\nconst showAddress1Error = computed(() => {\n return (\n (showErrors.value && !address.value.address1Valid.value) ||\n (showOptionalFeedback.value &&\n address.value.formData.address1.trim() === \"\")\n );\n});\n\nconst showCityError = computed(() => {\n return (\n (showErrors.value && !address.value.cityValid.value) ||\n (showOptionalFeedback.value && address.value.formData.city.trim() === \"\")\n );\n});\n\nconst showStateError = computed(() => {\n return (\n (showErrors.value && !address.value.stateValid.value) ||\n (showOptionalFeedback.value &&\n (address.value.formData.state ?? \"\").trim() === \"\")\n );\n});\n\nconst showZipError = computed(() => {\n return (\n (showErrors.value && !address.value.zipValid.value) ||\n (showOptionalFeedback.value && optionalZipInvalid.value)\n );\n});\n\nconst validationStylesActive = computed(() => {\n return isRequired.value\n ? address.value.addressValidate.value\n : showOptionalFeedback.value;\n});\n\nconst address1DisplayValid = computed(() => {\n return isRequired.value\n ? address.value.address1Valid.value\n : !showAddress1Error.value;\n});\n\nconst cityDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.cityValid.value\n : !showCityError.value;\n});\n\nconst stateDisplayValid = computed(() => {\n return isRequired.value\n ? address.value.stateValid.value\n : !showStateError.value;\n});\n\nconst zipDisplayValid = computed(() => {\n return isRequired.value ? address.value.zipValid.value : !showZipError.value;\n});\n\nconst address2PlaceholderDisplay = computed(() => {\n const basePlaceholder = resolvedMessages.value.placeholder.address2;\n\n if (fieldsetScope.value && isRequired.value) {\n return `${basePlaceholder} (Optional)`;\n }\n return basePlaceholder;\n});\n\nconst fieldsetErrorMessage = computed(() => {\n const messages: string[] = [];\n\n if (!nonZipRequiredFieldsValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.required);\n }\n\n if (!address.value.zipValid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n\nconst optionalFieldsetErrorMessage = computed(() => {\n const messages: string[] = [OPTIONAL_FIELDS_MESSAGE];\n\n if (optionalZipInvalid.value) {\n messages.push(resolvedMessages.value.fieldset.error.zip);\n }\n\n return messages.join(\" \");\n});\n</script>\n\n<style scoped>\n.fkui-us-address {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr;\n grid-template-areas:\n \"address1 address1 address1\"\n \"address2 address2 address2\"\n \"city state zip\"\n \"messages messages messages\";\n gap: 0.75rem;\n margin-bottom: 1rem;\n\n .address1 {\n grid-area: address1;\n }\n\n .address2 {\n grid-area: address2;\n }\n\n .city {\n grid-area: city;\n }\n\n .state {\n grid-area: state;\n }\n\n .zip {\n grid-area: zip;\n }\n\n .messages {\n grid-area: messages;\n }\n\n :deep(.fk-zip-textbox) {\n min-width: 100%;\n }\n}\n\n.fkui-us-address--fieldset-scope {\n row-gap: 0.5rem;\n\n .messages {\n margin-top: -0.375rem;\n }\n}\n</style>\n","<template>\n <td\n :id=\"id ?? ids.instanceId\"\n :class=\"['fkui-action-cell', 'k-table-td', className]\"\n :style=\"style\"\n :colspan=\"colSpan\"\n role=\"gridcell\"\n :aria-colindex=\"ariaColumnIndex\"\n :aria-selected=\"isSelected\"\n :data-grid-col-index=\"columnIndex\"\n >\n <Button\n v-for=\"trigger in config.triggers\"\n :key=\"trigger.key\"\n :ref=\"\n hasMenu(trigger)\n ? (element) => registerTrigger(trigger, element)\n : undefined\n \"\n :id=\"ids.compose(trigger.key, 'trigger')\"\n :svg-icon=\"trigger.icon\"\n type=\"button\"\n fill-mode=\"flat\"\n theme-color=\"primary\"\n rounded=\"full\"\n :aria-label=\"trigger.ariaLabel\"\n :aria-haspopup=\"hasMenu(trigger) ? 'menu' : undefined\"\n :aria-expanded=\"hasMenu(trigger) ? isTriggerActive(trigger) : undefined\"\n :disabled=\"trigger.disabled?.(dataItem)\"\n :tabindex=\"tabIndex\"\n @click=\"onTriggerClick(trigger)\"\n @keydown=\"onTriggerKeydown(trigger, $event)\"\n />\n </td>\n</template>\n\n<script setup lang=\"ts\">\nimport type { ComponentPublicInstance } from \"vue\";\nimport { Button } from \"@progress/kendo-vue-buttons\";\nimport type { GridCellProps } from \"@progress/kendo-vue-grid\";\nimport {\n useCompositeId,\n type RegisterableElement,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellMenuController,\n ActionCellTrigger,\n} from \"./types\";\n\ndefineOptions({ inheritAttrs: false });\n\ntype ActionCellProps = Partial<\n Pick<\n GridCellProps,\n | \"id\"\n | \"className\"\n | \"style\"\n | \"colSpan\"\n | \"ariaColumnIndex\"\n | \"isSelected\"\n | \"columnIndex\"\n >\n> & {\n dataItem: any;\n config: ActionCellConfig<any>;\n menuController: ActionCellMenuController<any>;\n tabIndex?: number;\n};\n\nconst props = withDefaults(defineProps<ActionCellProps>(), {\n tabIndex: -1,\n});\n\nconst ids = useCompositeId(\"action-cell\");\n\nconst getTriggerId = (trigger: ActionCellTrigger<any>) =>\n props.menuController.getTriggerId(trigger, props.dataItem);\n\nconst isTriggerActive = (trigger: ActionCellTrigger<any>) =>\n props.menuController.registry.isIdActive(getTriggerId(trigger));\n\nconst hasMenu = (trigger: ActionCellTrigger<any>) =>\n typeof trigger.items === \"function\";\n\nconst registerTrigger = (\n trigger: ActionCellTrigger<any>,\n element: Element | ComponentPublicInstance | null,\n) => {\n props.menuController.registry.register(\n getTriggerId(trigger),\n element as RegisterableElement,\n );\n};\n\nconst onTriggerClick = (trigger: ActionCellTrigger<any>) => {\n if (!hasMenu(trigger)) {\n props.menuController.handleDirectAction?.(trigger, props.dataItem);\n return;\n }\n props.menuController.handleTriggerClick(getTriggerId(trigger));\n};\n\nconst onTriggerKeydown = (\n trigger: ActionCellTrigger<any>,\n ...args: unknown[]\n) => {\n if (!hasMenu(trigger)) return;\n props.menuController.handleTriggerKeydown(getTriggerId(trigger), ...args);\n};\n</script>\n","import {\n computed,\n nextTick,\n toValue,\n type ComputedRef,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport {\n useActiveIdRegistry,\n usePopupMenu,\n type KendoMenuSelectEvent,\n type PopupMenuAnchorOptions,\n type PopupMenuElementRef,\n type PopupMenuOffset,\n type PopupMenuTriggerMode,\n type UseExclusiveGroupReturn,\n} from \"@featherk/composables\";\nimport type {\n ActionCellConfig,\n ActionCellDataItem,\n ActionCellMenuController,\n ActionCellMenuItem,\n} from \"./types\";\n\nexport type UseActionCellMenuOptions<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Repeatable trigger configuration, rendered by every `ActionCell` instance. */\n config: TConfig;\n /** All rows currently rendered; used to resolve the active row from its registry id. */\n rows: MaybeRefOrGetter<TData[]>;\n /** Derives a stable row id used to build the default registry id for each trigger. */\n getRowId: (row: TData) => string | number;\n /**\n * Overrides the registry ID formatting while preserving `<trigger.key>:<rowId>` semantics.\n * Active row and trigger resolution parse the first colon-separated segment as the trigger\n * key and the remaining segments as the row ID.\n */\n getTriggerId?: (trigger: TConfig[\"triggers\"][number], row: TData) => string;\n /** Ref to the single shared Kendo Menu instance. */\n menuRef: PopupMenuElementRef;\n /** Forwarded to `usePopupMenu`. Defaults to `\"button\"`. */\n triggerMode?: PopupMenuTriggerMode;\n /** Forwarded to `usePopupMenu`. Defaults to `true` for shared-popup positioning. */\n anchor?: PopupMenuAnchorOptions | true;\n /** Forwarded to `usePopupMenu`. */\n resolveFocusTarget?: () => HTMLElement | null;\n /** Forwarded to `usePopupMenu`. */\n focusTargetContainerSelector?: string;\n /** Coordinates mutual exclusivity with other active-id registries in this group. */\n group?: UseExclusiveGroupReturn;\n /**\n * Runs after a menu item is selected, with its original item and resolved row/trigger.\n * Direct-action triggers have no menu item and pass `undefined`.\n */\n onActionSelected: (\n item: ActionCellMenuItem | undefined,\n row: TData,\n trigger: TConfig[\"triggers\"][number],\n ) => void;\n};\n\nexport type UseActionCellMenuReturn<\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n> = {\n /** Spread onto every `<ActionCell>` instance. */\n actionCellProps: {\n config: TConfig;\n menuController: ActionCellMenuController<TData>;\n };\n /** Spread onto the single shared `<Popup>`. */\n popupProps: ComputedRef<{\n show: boolean;\n offset: PopupMenuOffset;\n onClose: () => void;\n }>;\n /** Spread onto the single shared Kendo `<Menu>`. */\n menuProps: ComputedRef<{\n items: ActionCellMenuItem[];\n vertical: true;\n onKeydown: (event: KeyboardEvent) => void;\n onSelect: (event: KendoMenuSelectEvent<ActionCellMenuItem>) => void;\n }>;\n /** Row resolved from the currently active trigger id, if any. */\n activeRow: ComputedRef<TData | null>;\n /** Trigger config resolved from the currently active trigger id, if any. */\n activeTrigger: ComputedRef<TConfig[\"triggers\"][number] | null>;\n /** Resolved `trigger.title(activeRow)`, or `null` when unset/no trigger is active. Render this yourself (e.g. `<strong>`) above the `<Menu>` — it is not part of `menuProps.items`. */\n activeTitle: ComputedRef<string | null>;\n};\n\n/**\n * Bundles the shared-popup wiring a parent needs to drive `ActionCell`: one\n * `useActiveIdRegistry`, one `usePopupMenu`, and the derived active\n * row/trigger/menu items. The parent still owns the `<Popup>`/`<Menu>`\n * template elements and any business logic for the selected action.\n */\nexport const useActionCellMenu = <\n TData extends ActionCellDataItem = ActionCellDataItem,\n TConfig extends ActionCellConfig<TData> = ActionCellConfig<TData>,\n>(\n options: UseActionCellMenuOptions<TData, TConfig>,\n): UseActionCellMenuReturn<TData, TConfig> => {\n const registry = useActiveIdRegistry<string>();\n options.group?.register(registry);\n\n const getTriggerId =\n options.getTriggerId ??\n ((trigger: TConfig[\"triggers\"][number], row: TData) =>\n `${trigger.key}:${options.getRowId(row)}`);\n\n const activeTrigger = computed(() => {\n const key = registry.activeId.value?.split(\":\")[0];\n return (\n (options.config.triggers.find((trigger) => trigger.key === key) as\n | TConfig[\"triggers\"][number]\n | undefined) ?? null\n );\n });\n\n const activeRow = computed(() => {\n const rowId = registry.activeId.value?.split(\":\").slice(1).join(\":\");\n if (rowId === undefined) return null;\n return (\n toValue(options.rows).find(\n (row) => String(options.getRowId(row)) === rowId,\n ) ?? null\n );\n });\n\n const activeMenuItems = computed<ActionCellMenuItem[]>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row && trigger ? (trigger.items?.(row) ?? []) : [];\n });\n\n const activeTitle = computed<string | null>(() => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n return row &&\n trigger &&\n typeof trigger.items === \"function\" &&\n trigger.title\n ? trigger.title(row)\n : null;\n });\n\n const popupMenu = usePopupMenu({\n isOpen: registry.isActive,\n triggerRef: registry.activeElement,\n menuRef: options.menuRef,\n triggerMode: options.triggerMode ?? \"button\",\n anchor: options.anchor ?? true,\n resolveFocusTarget: options.resolveFocusTarget,\n focusTargetContainerSelector: options.focusTargetContainerSelector,\n requestShow: (id) => {\n if (typeof id === \"string\") registry.activate(id);\n },\n requestHide: () => registry.deactivate(),\n menuLabel: activeTitle,\n });\n\n let triggerInteractionSequence = 0;\n\n const handleTriggerClick = (id: string) => {\n const interactionSequence = ++triggerInteractionSequence;\n options.group?.deactivateOthers(registry);\n\n if (registry.isActive.value && !registry.isIdActive(id)) {\n registry.deactivate();\n void nextTick(() => {\n if (interactionSequence === triggerInteractionSequence) {\n popupMenu.handleTriggerClick(id);\n }\n });\n return;\n }\n\n popupMenu.handleTriggerClick(id);\n };\n\n const handleDirectAction = (\n trigger: TConfig[\"triggers\"][number],\n row: TData,\n ) => {\n triggerInteractionSequence++;\n options.group?.deactivateOthers(registry);\n registry.deactivate();\n options.onActionSelected(undefined, row, trigger);\n };\n\n const handleTriggerKeydown = (id: string, ...args: unknown[]) => {\n const event = args[0] as KeyboardEvent;\n if (event.key === \"Enter\" || event.code === \"Space\") {\n event.preventDefault();\n handleTriggerClick(id);\n return;\n }\n popupMenu.handleTriggerKeydown(event, id);\n };\n\n const onMenuKeydown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") popupMenu.handleMenuEscape(event);\n };\n\n const onMenuSelect = (event: KendoMenuSelectEvent<ActionCellMenuItem>) => {\n const row = activeRow.value;\n const trigger = activeTrigger.value;\n popupMenu.handleMenuSelect(event, () => {\n if (row && trigger) {\n options.onActionSelected(event.item, row, trigger);\n }\n });\n };\n\n return {\n actionCellProps: {\n config: options.config,\n menuController: {\n registry,\n getTriggerId,\n handleTriggerClick,\n handleDirectAction,\n handleTriggerKeydown,\n },\n },\n popupProps: computed(() => ({\n show: registry.isActive.value,\n offset: popupMenu.offset.value,\n onClose: popupMenu.handlePopupClose,\n })),\n menuProps: computed(() => ({\n items: activeMenuItems.value,\n vertical: true as const,\n onKeydown: onMenuKeydown,\n onSelect: onMenuSelect,\n })),\n activeRow,\n activeTrigger,\n activeTitle,\n };\n};\n"],"names":["ZIP_CODE_MESSAGE","OPTIONAL_FIELDS_MESSAGE","props","__props","DEFAULT_MESSAGES","resolveMessages","source","resolvedMessages","computed","fieldScope","fieldsetScope","isRequired","showErrors","fieldIds","address","nonZipRequiredFieldsValid","hasAnyOptionalInput","optionalZipInvalid","zipDigits","optionalPartialInvalid","showOptionalFeedback","showAddress1Error","showCityError","showStateError","showZipError","validationStylesActive","address1DisplayValid","cityDisplayValid","stateDisplayValid","zipDisplayValid","address2PlaceholderDisplay","basePlaceholder","fieldsetErrorMessage","messages","optionalFieldsetErrorMessage","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_createVNode","_unref","TextBox","_Fragment","_createBlock","Error","_createTextVNode","_toDisplayString","Hint","showAddress2","_openBlock","_hoisted_2","_hoisted_3","_hoisted_4","DropDownList","_hoisted_5","_hoisted_6","ids","useCompositeId","getTriggerId","trigger","isTriggerActive","hasMenu","registerTrigger","element","onTriggerClick","onTriggerKeydown","args","id","className","style","colSpan","ariaColumnIndex","isSelected","columnIndex","_renderList","config","Button","dataItem","tabIndex","$event","useActionCellMenu","options","registry","useActiveIdRegistry","row","activeTrigger","key","activeRow","rowId","toValue","activeMenuItems","activeTitle","popupMenu","usePopupMenu","triggerInteractionSequence","handleTriggerClick","interactionSequence","nextTick","handleDirectAction","handleTriggerKeydown","event","onMenuKeydown","onMenuSelect"],"mappings":"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"}
@@ -22,6 +22,8 @@ export type UseActionCellMenuOptions<TData extends ActionCellDataItem = ActionCe
22
22
  anchor?: PopupMenuAnchorOptions | true;
23
23
  /** Forwarded to `usePopupMenu`. */
24
24
  resolveFocusTarget?: () => HTMLElement | null;
25
+ /** Forwarded to `usePopupMenu`. */
26
+ focusTargetContainerSelector?: string;
25
27
  /** Coordinates mutual exclusivity with other active-id registries in this group. */
26
28
  group?: UseExclusiveGroupReturn;
27
29
  /**
@@ -80,9 +80,9 @@ const popupMenu = usePopupMenu({
80
80
  const menuController: ActionCellMenuController<Row> = {
81
81
  registry,
82
82
  getTriggerId: (trigger, row) => `${trigger.key}:${row.id}`,
83
- handleTriggerClick: (id) => popupMenu.handleActionButtonClick(id),
83
+ handleTriggerClick: (id) => popupMenu.handleTriggerClick(id),
84
84
  handleTriggerKeydown: (id, ...args) =>
85
- popupMenu.handleActionButtonKeydown(args[0] as KeyboardEvent, id),
85
+ popupMenu.handleTriggerKeydown(args[0] as KeyboardEvent, id),
86
86
  };
87
87
 
88
88
  const activeMenuItems = computed(() => []);
@@ -10,7 +10,7 @@ one `usePopupMenu`, and the derived active row/trigger/menu items. The parent st
10
10
 
11
11
  Every other composable in `@featherk/composables` is generic: it improves or augments Kendo UI
12
12
  for Vue behavior without being tied to any specific `@featherk/ui` component. `useActionCellMenu`
13
- is the one exception, and deliberately so — it exists *only* to drive `ActionCell`. Its
13
+ is the one exception, and deliberately so — it exists _only_ to drive `ActionCell`. Its
14
14
  `actionCellProps` return value is shaped exactly as `ActionCell`'s props (`config`,
15
15
  `menuController`), and it has no purpose without that component.
16
16
 
@@ -61,7 +61,7 @@ Triggers without an `items` factory are direct actions: `useActionCellMenu` call
61
61
  3. Spread `actionCellProps` onto every `<ActionCell>` instance.
62
62
  4. Spread `popupProps`/`menuProps` onto the single shared `<Popup>`/`<Menu>`.
63
63
  5. Handle the selected item in `onActionSelected`; dispatch on `item.id` and use the
64
- resolved row and trigger for the business action. Direct actions pass `undefined` as item.
64
+ resolved row and trigger for the business action. Direct actions pass `undefined` as item.
65
65
 
66
66
  ```vue
67
67
  <template>
@@ -75,10 +75,7 @@ Triggers without an `items` factory are direct actions: `useActionCellMenu` call
75
75
 
76
76
  <!-- Step 4 -->
77
77
  <Popup v-bind="actionCellMenu.popupProps.value">
78
- <strong
79
- v-if="actionCellMenu.activeTitle.value"
80
- class="fk-menu-title"
81
- >
78
+ <strong v-if="actionCellMenu.activeTitle.value" class="fk-menu-title">
82
79
  {{ actionCellMenu.activeTitle.value }}
83
80
  </strong>
84
81
  <Menu ref="menuRef" v-bind="actionCellMenu.menuProps.value" />
@@ -116,21 +113,22 @@ const actionCellMenu = useActionCellMenu({
116
113
 
117
114
  ## API
118
115
 
119
- | Option | Required | Description |
120
- | -------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
121
- | `config` | Yes | `ActionCellConfig`-shaped trigger configuration, passed straight through to every `ActionCell`. |
122
- | `rows` | Yes | Current row list (ref, getter, or plain array); used to resolve the active row from its registry id. |
123
- | `getRowId` | Yes | Derives a stable row id used to build the default `"<trigger.key>:<rowId>"` registry id. |
124
- | `getTriggerId` | No | Overrides registry ID formatting, but must preserve `<trigger.key>:<rowId>` semantics because active row and trigger resolution parse the ID. |
125
- | `menuRef` | Yes | Ref to the single shared Kendo `Menu` instance. |
126
- | `triggerMode` | No | Forwarded to `usePopupMenu`. Defaults to `"button"`. |
127
- | `anchor` | No | Forwarded to `usePopupMenu` for offset positioning. Defaults to `true` because the shared popup targets dynamically resolved ActionCell triggers. |
128
- | `resolveFocusTarget` | No | Forwarded to `usePopupMenu` for keyboard-close focus restoration. |
129
- | `group` | No | A `useExclusiveGroup()` instance that deactivates other registered members before this menu opens. |
130
- | `onActionSelected` | Yes | Runs after a menu item is selected, with the original `(item, row, trigger)`. Direct actions pass `undefined` as `item`. |
116
+ | Option | Required | Description |
117
+ | ------------------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
118
+ | `config` | Yes | `ActionCellConfig`-shaped trigger configuration, passed straight through to every `ActionCell`. |
119
+ | `rows` | Yes | Current row list (ref, getter, or plain array); used to resolve the active row from its registry id. |
120
+ | `getRowId` | Yes | Derives a stable row id used to build the default `"<trigger.key>:<rowId>"` registry id. |
121
+ | `getTriggerId` | No | Overrides registry ID formatting, but must preserve `<trigger.key>:<rowId>` semantics because active row and trigger resolution parse the ID. |
122
+ | `menuRef` | Yes | Ref to the single shared Kendo `Menu` instance. |
123
+ | `triggerMode` | No | Forwarded to `usePopupMenu`. Defaults to `"button"`. |
124
+ | `anchor` | No | Forwarded to `usePopupMenu` for offset positioning. Defaults to `true` because the shared popup targets dynamically resolved ActionCell triggers. |
125
+ | `resolveFocusTarget` | No | Forwarded to `usePopupMenu` for keyboard-close focus restoration. |
126
+ | `focusTargetContainerSelector` | No | Forwarded to `usePopupMenu`; focuses the trigger's closest matching ancestor after a keyboard-driven close. |
127
+ | `group` | No | A `useExclusiveGroup()` instance that deactivates other registered members before this menu opens. |
128
+ | `onActionSelected` | Yes | Runs after a menu item is selected, with the original `(item, row, trigger)`. Direct actions pass `undefined` as `item`. |
131
129
 
132
130
  Each trigger in `config.triggers` may also define an optional `title?: (dataItem) => string`.
133
- When set, the resolved string is exposed via the returned `activeTitle` — it is *not* mixed
131
+ When set, the resolved string is exposed via the returned `activeTitle` — it is _not_ mixed
134
132
  into `menuProps.items`, since `useActionCellMenu` never renders markup and can't dictate how
135
133
  a consumer's `<Menu>` implementation would render a fake "title" item. Render `activeTitle`
136
134
  yourself as real markup with the shared `fk-menu-title` class (e.g.
@@ -169,7 +167,7 @@ the row ID. `useActionCellMenu` parses the active ID to resolve `activeTrigger`
169
167
  For example, this is compatible:
170
168
 
171
169
  ```ts
172
- getTriggerId: (trigger, row) => `${trigger.key}:row:${row.id}`
170
+ getTriggerId: (trigger, row) => `${trigger.key}:row:${row.id}`;
173
171
  ```
174
172
 
175
173
  because the composable resolves `trigger.key` from the first segment and `row:${row.id}` as
@@ -187,9 +185,9 @@ require defining lookup lifecycle/re-render behavior before changing the public
187
185
  hand-rolled shared instance would; it does not introduce a new popup/menu implementation.
188
186
  - Only manages `ActionCell`'s button-mode triggers. A row-level context menu alongside an
189
187
  `ActionCell` column still needs its own `useActiveIdRegistry` + `usePopupMenu` call with
190
- `triggerMode: "row"` — see
191
- [ActionCellGridDemo.vue](https://github.com/NantHealth/featherk/blob/integration/demos/src/views/ui/ActionCellGridDemo.vue)
192
- for a worked example of the two coexisting.
188
+ `triggerMode: "row"`. See the package-owned
189
+ [Focus and Exclusivity guide](https://github.com/NantHealth/featherk/blob/integration/packages/composables/docs/menu/usePopupMenuFocusAndExclusivity.md)
190
+ for a standalone example of the two coexisting.
193
191
  - **Coexisting with a sibling menu (e.g. a row-level context menu) requires a shared
194
192
  `useExclusiveGroup`.** Register the sibling registry with the group; `useActionCellMenu`
195
193
  registers its own registry automatically, so opening either menu deactivates the other.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@featherk/ui",
3
- "version": "0.12.5",
3
+ "version": "0.13.0",
4
4
  "main": "dist/featherk-ui.umd.js",
5
5
  "module": "dist/featherk-ui.es.js",
6
6
  "types": "dist/index.d.ts",