@pequity/squirrel 5.2.2 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/cjs/chunks/component.js +4 -0
  2. package/dist/cjs/chunks/p-dropdown-select.js +1 -1
  3. package/dist/cjs/chunks/p-icon.js +2180 -0
  4. package/dist/cjs/chunks/string.js +13 -0
  5. package/dist/cjs/component.js +28 -0
  6. package/dist/cjs/index.js +32 -2188
  7. package/dist/cjs/p-input-search.js +3 -2
  8. package/dist/cjs/p-loading.js +4 -7
  9. package/dist/cjs/p-modal.js +5 -2
  10. package/dist/cjs/string.js +32 -11
  11. package/dist/cjs/useSelectList.js +1 -1
  12. package/dist/es/chunks/component.js +5 -0
  13. package/dist/es/chunks/p-dropdown-select.js +1 -1
  14. package/dist/es/chunks/p-icon.js +2181 -0
  15. package/dist/es/chunks/string.js +14 -0
  16. package/dist/es/component.js +27 -0
  17. package/dist/es/index.js +31 -2187
  18. package/dist/es/p-input-search.js +3 -2
  19. package/dist/es/p-loading.js +4 -7
  20. package/dist/es/p-modal.js +5 -2
  21. package/dist/es/string.js +32 -12
  22. package/dist/es/useSelectList.js +1 -1
  23. package/dist/squirrel/components/p-action-bar/p-action-bar.types.d.ts +3 -2
  24. package/dist/squirrel/utils/component.d.ts +2 -0
  25. package/dist/squirrel/utils/component.spec.d.ts +1 -0
  26. package/dist/squirrel/utils/string.d.ts +1 -0
  27. package/dist/squirrel/utils/string.spec.d.ts +1 -0
  28. package/dist/style.css +33 -33
  29. package/package.json +22 -27
  30. package/squirrel/components/p-action-bar/p-action-bar.spec.js +47 -15
  31. package/squirrel/components/p-action-bar/p-action-bar.stories.js +6 -0
  32. package/squirrel/components/p-action-bar/p-action-bar.types.ts +4 -2
  33. package/squirrel/components/p-action-bar/p-action-bar.vue +9 -3
  34. package/squirrel/components/p-alert/p-alert.spec.js +1 -1
  35. package/squirrel/components/p-avatar/p-avatar.spec.js +16 -1
  36. package/squirrel/components/p-btn/p-btn.spec.js +3 -7
  37. package/squirrel/components/p-card/p-card.spec.js +1 -1
  38. package/squirrel/components/p-checkbox/p-checkbox.spec.js +1 -1
  39. package/squirrel/components/p-chips/p-chips.spec.js +1 -1
  40. package/squirrel/components/p-close-btn/p-close-btn.spec.js +1 -1
  41. package/squirrel/components/p-dropdown/p-dropdown.spec.js +5 -9
  42. package/squirrel/components/p-dropdown-select/p-dropdown-select.spec.js +4 -5
  43. package/squirrel/components/p-file-upload/p-file-upload.spec.js +1 -1
  44. package/squirrel/components/p-icon/p-icon.spec.js +15 -29
  45. package/squirrel/components/p-info-icon/p-info-icon.spec.js +1 -1
  46. package/squirrel/components/p-inline-date-picker/p-inline-date-picker.spec.js +4 -4
  47. package/squirrel/components/p-input/p-input.spec.js +1 -1
  48. package/squirrel/components/p-input-number/p-input-number.spec.js +1 -1
  49. package/squirrel/components/p-input-percent/p-input-percent.spec.js +1 -1
  50. package/squirrel/components/p-input-search/p-input-search.spec.js +1 -1
  51. package/squirrel/components/p-input-search/p-input-search.vue +1 -1
  52. package/squirrel/components/p-link/p-link.spec.js +3 -7
  53. package/squirrel/components/p-loading/p-loading.spec.js +23 -23
  54. package/squirrel/components/p-loading/p-loading.vue +2 -7
  55. package/squirrel/components/p-modal/p-modal-basic.spec.js +1 -1
  56. package/squirrel/components/p-modal/p-modal-events.spec.js +1 -1
  57. package/squirrel/components/p-modal/p-modal-features.spec.js +1 -1
  58. package/squirrel/components/p-modal/p-modal.vue +4 -0
  59. package/squirrel/components/p-pagination/p-pagination.spec.js +1 -1
  60. package/squirrel/components/p-pagination-info/p-pagination-info.spec.js +1 -1
  61. package/squirrel/components/p-progress-bar/p-progess-bar.spec.js +1 -1
  62. package/squirrel/components/p-ring-loader/p-ring-loader.spec.js +1 -1
  63. package/squirrel/components/p-select/p-select.spec.js +1 -1
  64. package/squirrel/components/p-select-btn/p-select-btn.spec.js +1 -1
  65. package/squirrel/components/p-select-list/p-select-list.spec.js +4 -5
  66. package/squirrel/components/p-select-pill/p-select-pill.spec.js +1 -1
  67. package/squirrel/components/p-skeleton-loader/p-skeleton-loader.spec.js +1 -1
  68. package/squirrel/components/p-table/p-table.spec.js +1 -1
  69. package/squirrel/components/p-table-header-cell/p-filter-icon.spec.js +1 -1
  70. package/squirrel/components/p-table-header-cell/p-table-header-cell.spec.js +1 -1
  71. package/squirrel/components/p-table-loader/p-table-loader.spec.js +1 -1
  72. package/squirrel/components/p-table-sort/p-table-sort.spec.js +1 -1
  73. package/squirrel/components/p-table-td/p-table-td.spec.js +35 -1
  74. package/squirrel/components/p-tabs/p-tabs.spec.js +1 -1
  75. package/squirrel/components/p-textarea/p-textarea.spec.js +1 -1
  76. package/squirrel/components/p-toggle/p-toggle.spec.js +1 -1
  77. package/squirrel/composables/useInputClasses.spec.js +41 -0
  78. package/squirrel/index.spec.js +21 -0
  79. package/squirrel/utils/component.spec.ts +29 -0
  80. package/squirrel/utils/component.ts +5 -0
  81. package/squirrel/utils/dom.spec.js +2 -3
  82. package/squirrel/utils/listKeyboardNavigation.spec.js +5 -9
  83. package/squirrel/utils/sanitization.spec.js +1 -1
  84. package/squirrel/utils/{string.spec.js → string.spec.ts} +19 -1
  85. package/squirrel/utils/string.ts +2 -0
  86. package/squirrel/utils/tailwind.spec.js +27 -0
@@ -55,7 +55,8 @@ const _sfc_main = defineComponent({
55
55
  clearSearch() {
56
56
  this.query = "";
57
57
  requestAnimationFrame(() => {
58
- this.$refs.searchInput.$el.querySelector("input").focus();
58
+ var _a;
59
+ (_a = this.$refs.searchInput) == null ? void 0 : _a.$el.querySelector("input").focus();
59
60
  });
60
61
  },
61
62
  keydownEnter() {
@@ -106,7 +107,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
106
107
  _: 1
107
108
  }, 16, ["modelValue", "size", "onKeydown"]);
108
109
  }
109
- const PInputSearch = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-7a1e1e82"]]);
110
+ const PInputSearch = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-60b13ffe"]]);
110
111
  export {
111
112
  PInputSearch as default
112
113
  };
@@ -1,4 +1,5 @@
1
1
  import { defineComponent, ref, watch, toValue, onBeforeUnmount, openBlock, createBlock, Teleport, createVNode, Transition, withCtx, unref, createElementBlock, createElementVNode, normalizeStyle, resolveDynamicComponent, normalizeProps, mergeProps, normalizeClass, toDisplayString, createCommentVNode } from "vue";
2
+ import { i as isComponent } from "./chunks/component.js";
2
3
  import { usePLoading } from "./usePLoading.js";
3
4
  import { _ as _export_sfc } from "./chunks/_plugin-vue_export-helper.js";
4
5
  const _hoisted_1 = {
@@ -32,10 +33,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
32
33
  },
33
34
  { flush: "post" }
34
35
  );
35
- const isComponent = (content2) => {
36
- const isComponent2 = typeof content2 === "object" && content2 !== null;
37
- return isComponent2;
38
- };
39
36
  onBeforeUnmount(() => {
40
37
  loadingHide();
41
38
  });
@@ -57,7 +54,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
57
54
  "enter-active-class": "transition duration-500"
58
55
  }, {
59
56
  default: withCtx(() => [
60
- isComponent(unref(content)) ? (openBlock(), createBlock(resolveDynamicComponent(unref(content)), normalizeProps(mergeProps({ key: 0 }, unref(componentProps))), null, 16)) : (openBlock(), createElementBlock("div", {
57
+ unref(isComponent)(unref(content)) ? (openBlock(), createBlock(resolveDynamicComponent(unref(content)), normalizeProps(mergeProps({ key: 0 }, unref(componentProps))), null, 16)) : (openBlock(), createElementBlock("div", {
61
58
  key: 1,
62
59
  class: normalizeClass(textDivClass)
63
60
  }, toDisplayString(unref(content)), 1))
@@ -74,7 +71,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
74
71
  ref_key: "dimsReference",
75
72
  ref: dimsReference
76
73
  }, [
77
- isComponent(unref(content)) ? (openBlock(), createBlock(resolveDynamicComponent(unref(content)), normalizeProps(mergeProps({ key: 0 }, unref(componentProps))), null, 16)) : (openBlock(), createElementBlock("div", {
74
+ unref(isComponent)(unref(content)) ? (openBlock(), createBlock(resolveDynamicComponent(unref(content)), normalizeProps(mergeProps({ key: 0 }, unref(componentProps))), null, 16)) : (openBlock(), createElementBlock("div", {
78
75
  key: 1,
79
76
  class: normalizeClass(textDivClass)
80
77
  }, toDisplayString(unref(content)), 1))
@@ -84,7 +81,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
84
81
  };
85
82
  }
86
83
  });
87
- const pLoading = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-f0f6bdd4"]]);
84
+ const pLoading = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-980d32e1"]]);
88
85
  export {
89
86
  pLoading as default
90
87
  };
@@ -110,7 +110,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
110
110
  ],
111
111
  setup(__props, { emit: __emit }) {
112
112
  useCssVars((_ctx) => ({
113
- "4d751ed2": __props.maxWidth
113
+ "4046568f": __props.maxWidth
114
114
  }));
115
115
  let animatingZIndex = 0;
116
116
  const emit = __emit;
@@ -194,6 +194,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
194
194
  }, 0);
195
195
  };
196
196
  const handleFocus = (wrapper) => {
197
+ if (!wrapper) {
198
+ return;
199
+ }
197
200
  const autofocus = wrapper.querySelector("[autofocus]");
198
201
  if (autofocus) {
199
202
  autofocus.focus();
@@ -364,7 +367,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
364
367
  };
365
368
  }
366
369
  });
367
- const pModal = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-fb5dbd9f"]]);
370
+ const pModal = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-7e6a0b8d"]]);
368
371
  export {
369
372
  pModal as default
370
373
  };
package/dist/es/string.js CHANGED
@@ -1,12 +1,32 @@
1
- const toString = (value) => {
2
- if (typeof value === "number" && (!isFinite(value) || isNaN(value))) {
3
- return "";
4
- }
5
- if (typeof value !== "string" && typeof value !== "number") {
6
- return "";
7
- }
8
- return String(value);
9
- };
10
- export {
11
- toString
12
- };
1
+ import { t as toString, i as isString } from "./chunks/string.js";
2
+ describe("toString", () => {
3
+ it.each(["", /* @__PURE__ */ new Date(), NaN, Infinity, {}, [], true, false, null, void 0])(
4
+ "returns an empty string if input is %s",
5
+ (val) => {
6
+ expect(toString(val)).toBe("");
7
+ }
8
+ );
9
+ it("returns a string when the value is a string", () => {
10
+ expect(toString("test")).toBe("test");
11
+ });
12
+ it("converts the value to a string when the value is a number", () => {
13
+ expect(toString(290349822e-2)).toBe("2903498.22");
14
+ });
15
+ });
16
+ describe("isString", () => {
17
+ it("should return true for a string", () => {
18
+ expect(isString("hello")).toBe(true);
19
+ });
20
+ it.each([
21
+ [123, false],
22
+ [{}, false],
23
+ [[], false],
24
+ [null, false],
25
+ [void 0, false],
26
+ [true, false],
27
+ [() => {
28
+ }, false]
29
+ ])("should return %s for %p", (input, expected) => {
30
+ expect(isString(input)).toBe(expected);
31
+ });
32
+ });
@@ -2,7 +2,7 @@ import { ref, computed, watch, onUnmounted, nextTick } from "vue";
2
2
  import { setupListKeyboardNavigation } from "./listKeyboardNavigation.js";
3
3
  import { cloneDeep, uniqBy } from "lodash-es";
4
4
  import { isObject } from "./object.js";
5
- import { toString } from "./string.js";
5
+ import { t as toString } from "./chunks/string.js";
6
6
  import { useVirtualizer } from "@tanstack/vue-virtual";
7
7
  const createInternalItems = (items) => {
8
8
  let arr = Array.isArray(items) ? items.slice() : [];
@@ -1,10 +1,11 @@
1
+ import { type Component } from 'vue';
1
2
  export type PActionBarAction = {
2
3
  name?: string;
3
4
  label: string;
4
- icon?: string;
5
+ icon?: string | Component;
5
6
  subActions?: {
6
7
  name: string;
7
8
  label: string;
8
- icon?: string;
9
+ icon?: string | Component;
9
10
  }[];
10
11
  };
@@ -0,0 +1,2 @@
1
+ import { type Component } from 'vue';
2
+ export declare const isComponent: (val: unknown) => val is Component;
@@ -0,0 +1 @@
1
+ export {};
@@ -1 +1,2 @@
1
+ export declare const isString: (val: unknown) => val is string;
1
2
  export declare const toString: (value: unknown) => string;
@@ -0,0 +1 @@
1
+ export {};
package/dist/style.css CHANGED
@@ -145,77 +145,77 @@ div[id^=popper_].dropdown .v-popper__inner .dropdown-menu .dropdown-divider {
145
145
  border-color: var(--color-p-gray-30);
146
146
 
147
147
  opacity: 1
148
- }.icon.clear[data-v-7a1e1e82] {
148
+ }.icon.clear[data-v-60b13ffe] {
149
149
  background-image: url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_1634_880)'%3e%3cpath%20d='M16%208C16%206.41775%2015.5308%204.87104%2014.6518%203.55544C13.7727%202.23985%2012.5233%201.21447%2011.0615%200.608967C9.59966%200.00346629%207.99113%20-0.15496%206.43928%200.153721C4.88743%200.462403%203.46197%201.22433%202.34315%202.34315C1.22433%203.46197%200.462403%204.88743%200.153721%206.43928C-0.15496%207.99113%200.00346629%209.59966%200.608967%2011.0615C1.21447%2012.5233%202.23985%2013.7727%203.55544%2014.6518C4.87104%2015.5308%206.41775%2016%208%2016C10.1217%2016%2012.1566%2015.1571%2013.6569%2013.6569C15.1571%2012.1566%2016%2010.1217%2016%208ZM11.14%2010.1867C11.2642%2010.3116%2011.3339%2010.4805%2011.3339%2010.6567C11.3339%2010.8328%2011.2642%2011.0018%2011.14%2011.1267C11.078%2011.1892%2011.0043%2011.2388%2010.9231%2011.2726C10.8418%2011.3064%2010.7547%2011.3239%2010.6667%2011.3239C10.5787%2011.3239%2010.4915%2011.3064%2010.4103%2011.2726C10.329%2011.2388%2010.2553%2011.1892%2010.1933%2011.1267L8.12%209.05334C8.08809%209.02429%208.04649%209.0082%208.00334%209.0082C7.96019%209.0082%207.91858%209.02429%207.88667%209.05334L5.81334%2011.1267C5.6858%2011.2359%205.52175%2011.293%205.35397%2011.2865C5.18618%2011.28%205.02702%2011.2104%204.90829%2011.0917C4.78957%2010.973%204.72001%2010.8138%204.71353%2010.646C4.70705%2010.4783%204.76412%2010.3142%204.87334%2010.1867L6.94667%208.11334C6.97572%208.08142%206.99181%208.03982%206.99181%207.99667C6.99181%207.95352%206.97572%207.91192%206.94667%207.88L4.87334%205.80667C4.81085%205.7447%204.76126%205.67096%204.72741%205.58972C4.69356%205.50848%204.67614%205.42135%204.67614%205.33334C4.67614%205.24533%204.69356%205.15819%204.72741%205.07695C4.76126%204.99571%204.81085%204.92198%204.87334%204.86C4.99825%204.73584%205.16721%204.66614%205.34334%204.66614C5.51946%204.66614%205.68843%204.73584%205.81334%204.86L7.88667%206.93334C7.90163%206.94928%207.91971%206.96199%207.93977%206.97068C7.95984%206.97936%207.98147%206.98384%208.00334%206.98384C8.0252%206.98384%208.04684%206.97936%208.0669%206.97068C8.08697%206.96199%208.10504%206.94928%208.12%206.93334L10.1933%204.86C10.2555%204.79784%2010.3293%204.74854%2010.4105%204.7149C10.4917%204.68126%2010.5788%204.66394%2010.6667%204.66394C10.7546%204.66394%2010.8416%204.68126%2010.9228%204.7149C11.0041%204.74854%2011.0778%204.79784%2011.14%204.86C11.2022%204.92216%2011.2515%204.99596%2011.2851%205.07717C11.3188%205.15839%2011.3361%205.24543%2011.3361%205.33334C11.3361%205.42124%2011.3188%205.50829%2011.2851%205.5895C11.2515%205.67072%2011.2022%205.74451%2011.14%205.80667L9.06667%207.88C9.05073%207.89497%209.03802%207.91304%209.02933%207.93311C9.02065%207.95317%209.01616%207.97481%209.01616%207.99667C9.01616%208.01854%209.02065%208.04017%209.02933%208.06024C9.03802%208.0803%209.05073%208.09837%209.06667%208.11334L11.14%2010.1867Z'%20fill='%23A0AEC0'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_1634_880'%3e%3crect%20width='16'%20height='16'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
150
150
  background-position: center center;
151
151
  transition: background-image 0.4s;
152
152
  }
153
- .icon.clear-sm[data-v-7a1e1e82] {
153
+ .icon.clear-sm[data-v-60b13ffe] {
154
154
  background-size: 0.875rem 0.875rem;
155
155
  width: 0.875rem;
156
156
  height: 0.875rem;
157
157
  bottom: 0.5rem;
158
158
  right: 0.375rem;
159
159
  }
160
- .icon.clear-md[data-v-7a1e1e82] {
160
+ .icon.clear-md[data-v-60b13ffe] {
161
161
  background-size: 1rem 1rem;
162
162
  height: 1rem;
163
163
  width: 1rem;
164
164
  bottom: 0.75rem;
165
165
  right: 0.5rem;
166
166
  }
167
- .icon.clear-lg[data-v-7a1e1e82] {
167
+ .icon.clear-lg[data-v-60b13ffe] {
168
168
  background-size: 1rem 1rem;
169
169
  height: 1rem;
170
170
  width: 1rem;
171
171
  bottom: 1rem;
172
172
  right: 0.5rem;
173
173
  }
174
- .icon.clear[data-v-7a1e1e82]:hover {
174
+ .icon.clear[data-v-60b13ffe]:hover {
175
175
  background-image: url("data:image/svg+xml,%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_1634_896)'%3e%3cpath%20d='M16%208C16%206.41775%2015.5308%204.87104%2014.6518%203.55544C13.7727%202.23985%2012.5233%201.21447%2011.0615%200.608967C9.59966%200.00346629%207.99113%20-0.15496%206.43928%200.153721C4.88743%200.462403%203.46197%201.22433%202.34315%202.34315C1.22433%203.46197%200.462403%204.88743%200.153721%206.43928C-0.15496%207.99113%200.00346629%209.59966%200.608967%2011.0615C1.21447%2012.5233%202.23985%2013.7727%203.55544%2014.6518C4.87104%2015.5308%206.41775%2016%208%2016C10.1217%2016%2012.1566%2015.1571%2013.6569%2013.6569C15.1571%2012.1566%2016%2010.1217%2016%208ZM11.14%2010.1867C11.2642%2010.3116%2011.3339%2010.4805%2011.3339%2010.6567C11.3339%2010.8328%2011.2642%2011.0018%2011.14%2011.1267C11.078%2011.1892%2011.0043%2011.2388%2010.9231%2011.2726C10.8418%2011.3064%2010.7547%2011.3239%2010.6667%2011.3239C10.5787%2011.3239%2010.4915%2011.3064%2010.4103%2011.2726C10.329%2011.2388%2010.2553%2011.1892%2010.1933%2011.1267L8.12%209.05334C8.08809%209.02429%208.04649%209.0082%208.00334%209.0082C7.96019%209.0082%207.91858%209.02429%207.88667%209.05334L5.81334%2011.1267C5.6858%2011.2359%205.52175%2011.293%205.35397%2011.2865C5.18618%2011.28%205.02702%2011.2104%204.90829%2011.0917C4.78957%2010.973%204.72001%2010.8138%204.71353%2010.646C4.70705%2010.4783%204.76412%2010.3142%204.87334%2010.1867L6.94667%208.11334C6.97572%208.08142%206.99181%208.03982%206.99181%207.99667C6.99181%207.95352%206.97572%207.91192%206.94667%207.88L4.87334%205.80667C4.81085%205.7447%204.76126%205.67096%204.72741%205.58972C4.69356%205.50848%204.67614%205.42135%204.67614%205.33334C4.67614%205.24533%204.69356%205.15819%204.72741%205.07695C4.76126%204.99571%204.81085%204.92198%204.87334%204.86C4.99825%204.73584%205.16721%204.66614%205.34334%204.66614C5.51946%204.66614%205.68843%204.73584%205.81334%204.86L7.88667%206.93334C7.90163%206.94928%207.91971%206.96199%207.93977%206.97068C7.95984%206.97936%207.98147%206.98384%208.00334%206.98384C8.0252%206.98384%208.04684%206.97936%208.0669%206.97068C8.08697%206.96199%208.10504%206.94928%208.12%206.93334L10.1933%204.86C10.2555%204.79784%2010.3293%204.74854%2010.4105%204.7149C10.4917%204.68126%2010.5788%204.66394%2010.6667%204.66394C10.7546%204.66394%2010.8416%204.68126%2010.9228%204.7149C11.0041%204.74854%2011.0778%204.79784%2011.14%204.86C11.2022%204.92216%2011.2515%204.99596%2011.2851%205.07717C11.3188%205.15839%2011.3361%205.24543%2011.3361%205.33334C11.3361%205.42124%2011.3188%205.50829%2011.2851%205.5895C11.2515%205.67072%2011.2022%205.74451%2011.14%205.80667L9.06667%207.88C9.05073%207.89497%209.03802%207.91304%209.02933%207.93311C9.02065%207.95317%209.01616%207.97481%209.01616%207.99667C9.01616%208.01854%209.02065%208.04017%209.02933%208.06024C9.03802%208.0803%209.05073%208.09837%209.06667%208.11334L11.14%2010.1867Z'%20fill='%23424E6E'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_1634_896'%3e%3crect%20width='16'%20height='16'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
176
176
  }
177
- .icon.search[data-v-7a1e1e82] {
177
+ .icon.search[data-v-60b13ffe] {
178
178
  background-image: url("data:image/svg+xml,%3csvg%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_9127_330342)'%3e%3cpath%20d='M11.705%2010.295L9.38501%208.00004C10.0193%207.0497%2010.3178%205.91467%2010.2331%204.77526C10.1484%203.63584%209.68546%202.5574%208.91771%201.71124C8.14996%200.86508%207.12147%200.299735%205.99563%200.105014C4.8698%20-0.0897079%203.71117%200.0973621%202.70383%200.636506C1.69648%201.17565%200.898177%202.03595%200.435738%203.08073C-0.0267015%204.12552%20-0.126757%205.29487%200.151467%206.40303C0.429691%207.51119%201.07024%208.4946%201.97135%209.19704C2.87246%209.89948%203.98246%2010.2807%205.12501%2010.28C6.13901%2010.2811%207.13002%209.97801%207.97001%209.41004L10.295%2011.735C10.4824%2011.9213%2010.7358%2012.0258%2011%2012.0258C11.2642%2012.0258%2011.5176%2011.9213%2011.705%2011.735C11.8018%2011.6418%2011.8788%2011.5299%2011.9314%2011.4062C11.9839%2011.2825%2012.011%2011.1495%2012.011%2011.015C12.011%2010.8806%2011.9839%2010.7476%2011.9314%2010.6239C11.8788%2010.5002%2011.8018%2010.3883%2011.705%2010.295ZM5.12501%201.50004C5.84176%201.50004%206.54241%201.71251%207.13843%202.11061C7.73445%202.50871%208.19908%203.07456%208.47359%203.73666C8.74811%204.39875%208.82019%205.12736%208.68072%205.8304C8.54125%206.53345%208.1965%207.17937%207.69004%207.68653C7.18357%208.19369%206.53813%208.53934%205.83527%208.67977C5.13242%208.82021%204.40371%208.74913%203.74125%208.47553C3.07878%208.20193%202.51228%207.73808%202.11336%207.14261C1.71444%206.54714%201.501%205.84678%201.50001%205.13004C1.50001%204.16817%201.88177%203.24562%202.56145%202.565C3.24112%201.88439%204.16314%201.50136%205.12501%201.50004Z'%20fill='%23718096'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_9127_330342'%3e%3crect%20width='12'%20height='12'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
179
179
  }
180
- .icon.search-sm[data-v-7a1e1e82] {
180
+ .icon.search-sm[data-v-60b13ffe] {
181
181
  background-size: 0.75rem 0.75rem;
182
182
  left: 0.5rem;
183
183
  bottom: 0.625rem;
184
184
  width: 0.75rem;
185
185
  height: 0.75rem;
186
186
  }
187
- .icon.search-md[data-v-7a1e1e82] {
187
+ .icon.search-md[data-v-60b13ffe] {
188
188
  background-size: 1rem 1rem;
189
189
  width: 1rem;
190
190
  height: 1rem;
191
191
  left: 0.75rem;
192
192
  bottom: 0.75rem;
193
193
  }
194
- .icon.search-lg[data-v-7a1e1e82] {
194
+ .icon.search-lg[data-v-60b13ffe] {
195
195
  background-size: 1rem 1rem;
196
196
  width: 1rem;
197
197
  height: 1rem;
198
198
  left: 1.125rem;
199
199
  bottom: 1rem;
200
200
  }
201
- .icon.enter[data-v-7a1e1e82] {
201
+ .icon.enter[data-v-60b13ffe] {
202
202
  background-image: url("data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_1627_786)'%3e%3crect%20width='24'%20height='24'%20rx='5'%20fill='%23ECF1FF'/%3e%3cpath%20d='M19.17%201.03744e-05H4.83C4.19619%20-0.00130459%203.56834%200.122398%202.98239%200.364037C2.39645%200.605676%201.86392%200.960506%201.41528%201.40822C0.966641%201.85592%200.610708%202.38772%200.367855%202.97316C0.125002%203.55861%20-1.36406e-06%204.1862%200%204.82001L0%2019.17C0%2020.451%200.508874%2021.6795%201.41467%2022.5853C2.32048%2023.4911%203.549%2024%204.83%2024H19.17C20.4502%2023.9974%2021.6772%2023.4876%2022.5824%2022.5824C23.4876%2021.6772%2023.9974%2020.4502%2024%2019.17V4.82001C23.9974%203.54075%2023.4873%202.31479%2022.5818%201.41115C21.6763%200.507508%2020.4493%207.63258e-06%2019.17%201.03744e-05ZM22%2019.17C22%2019.9206%2021.7018%2020.6404%2021.1711%2021.1711C20.6404%2021.7018%2019.9206%2022%2019.17%2022H4.83C4.07944%2022%203.35962%2021.7018%202.82889%2021.1711C2.29816%2020.6404%202%2019.9206%202%2019.17V4.82001C2.00265%204.07118%202.30197%203.35393%202.83242%202.82536C3.36286%202.29679%204.08117%202.00001%204.83%202.00001H19.17C19.9188%202.00001%2020.6371%202.29679%2021.1676%202.82536C21.698%203.35393%2021.9974%204.07118%2022%204.82001V19.17Z'%20fill='%234750EB'/%3e%3cpath%20d='M17.5%207.5C17.2348%207.5%2016.9804%207.60536%2016.7929%207.79289C16.6054%207.98043%2016.5%208.23478%2016.5%208.5V11.25C16.5%2011.3163%2016.4737%2011.3799%2016.4268%2011.4268C16.3799%2011.4737%2016.3163%2011.5%2016.25%2011.5H10.75C10.6837%2011.5%2010.6201%2011.4737%2010.5732%2011.4268C10.5263%2011.3799%2010.5%2011.3163%2010.5%2011.25V9.5C10.5012%209.30138%2010.4431%209.10691%2010.3333%208.94139C10.2235%208.77587%2010.0669%208.6468%209.88348%208.57063C9.70004%208.49446%209.49807%208.47465%209.30332%208.51372C9.10857%208.55279%208.92987%208.64897%208.79%208.79L5.79%2011.79C5.60375%2011.9774%205.49921%2012.2308%205.49921%2012.495C5.49921%2012.7592%205.60375%2013.0126%205.79%2013.2L8.79%2016.2C8.88261%2016.2945%208.99306%2016.3697%209.11493%2016.4212C9.23681%2016.4727%209.36769%2016.4995%209.5%2016.5C9.76522%2016.5%2010.0196%2016.3946%2010.2071%2016.2071C10.3946%2016.0196%2010.5%2015.7652%2010.5%2015.5V13.75C10.5%2013.6837%2010.5263%2013.6201%2010.5732%2013.5732C10.6201%2013.5263%2010.6837%2013.5%2010.75%2013.5H16.5C17.0304%2013.5%2017.5391%2013.2893%2017.9142%2012.9142C18.2893%2012.5391%2018.5%2012.0304%2018.5%2011.5V8.5C18.5%208.23478%2018.3946%207.98043%2018.2071%207.79289C18.0196%207.60536%2017.7652%207.5%2017.5%207.5Z'%20fill='%234750EB'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_1627_786'%3e%3crect%20width='24'%20height='24'%20rx='5'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
203
203
  }
204
- .icon.enter-sm[data-v-7a1e1e82] {
204
+ .icon.enter-sm[data-v-60b13ffe] {
205
205
  background-size: 1rem 1rem;
206
206
  width: 1rem;
207
207
  height: 1rem;
208
208
  right: 1.5rem;
209
209
  bottom: 0.5rem;
210
210
  }
211
- .icon.enter-md[data-v-7a1e1e82] {
211
+ .icon.enter-md[data-v-60b13ffe] {
212
212
  background-size: 1.5rem 1.5rem;
213
213
  width: 1.5rem;
214
214
  height: 1.5rem;
215
215
  right: 2.0625rem;
216
216
  bottom: 0.5rem;
217
217
  }
218
- .icon.enter-lg[data-v-7a1e1e82] {
218
+ .icon.enter-lg[data-v-60b13ffe] {
219
219
  background-size: 1.5rem 1.5rem;
220
220
  width: 1.5rem;
221
221
  height: 1.5rem;
@@ -381,12 +381,12 @@ from {
381
381
  to {
382
382
  opacity: 0;
383
383
  }
384
- }.fadeInDown[data-v-f0f6bdd4] {
384
+ }.fadeInDown[data-v-980d32e1] {
385
385
  animation-duration: 0.4s;
386
386
  animation-fill-mode: both;
387
- animation-name: fadeInDown-f0f6bdd4;
387
+ animation-name: fadeInDown-980d32e1;
388
388
  }
389
- @keyframes fadeInDown-f0f6bdd4 {
389
+ @keyframes fadeInDown-980d32e1 {
390
390
  0% {
391
391
  opacity: 0;
392
392
  transform: translate3d(0, -100%, 0);
@@ -396,12 +396,12 @@ to {
396
396
  transform: none;
397
397
  }
398
398
  }
399
- .fadeOutUp[data-v-f0f6bdd4] {
399
+ .fadeOutUp[data-v-980d32e1] {
400
400
  animation-duration: 0.25s;
401
401
  animation-fill-mode: both;
402
- animation-name: fadeOutUp-f0f6bdd4;
402
+ animation-name: fadeOutUp-980d32e1;
403
403
  }
404
- @keyframes fadeOutUp-f0f6bdd4 {
404
+ @keyframes fadeOutUp-980d32e1 {
405
405
  0% {
406
406
  opacity: 1;
407
407
  }
@@ -409,33 +409,33 @@ to {
409
409
  opacity: 0;
410
410
  transform: translate3d(0, -100%, 0);
411
411
  }
412
- }.pm[data-v-fb5dbd9f] {
412
+ }.pm[data-v-7e6a0b8d] {
413
413
  width: calc(100% - 32px);
414
414
  min-width: 110px;
415
- max-width: var(--4d751ed2);
415
+ max-width: var(--4046568f);
416
416
  max-height: calc(100vh - 32px);
417
417
  }
418
- .fadeIn[data-v-fb5dbd9f] {
418
+ .fadeIn[data-v-7e6a0b8d] {
419
419
  animation-duration: 0.4s;
420
- animation-name: fadeInFrames-fb5dbd9f;
420
+ animation-name: fadeInFrames-7e6a0b8d;
421
421
  animation-fill-mode: both;
422
422
  }
423
- .fadeOut[data-v-fb5dbd9f] {
423
+ .fadeOut[data-v-7e6a0b8d] {
424
424
  animation-duration: 0.2s;
425
- animation-name: fadeOutFrames-fb5dbd9f;
425
+ animation-name: fadeOutFrames-7e6a0b8d;
426
426
  animation-fill-mode: both;
427
427
  }
428
- .slideInTop[data-v-fb5dbd9f] {
428
+ .slideInTop[data-v-7e6a0b8d] {
429
429
  animation-duration: 0.4s;
430
- animation-name: fadeInFrames-fb5dbd9f,slideInTopFrames-fb5dbd9f;
430
+ animation-name: fadeInFrames-7e6a0b8d,slideInTopFrames-7e6a0b8d;
431
431
  animation-fill-mode: both;
432
432
  }
433
- .slideOutTop[data-v-fb5dbd9f] {
433
+ .slideOutTop[data-v-7e6a0b8d] {
434
434
  animation-duration: 0.2s;
435
- animation-name: fadeOutFrames-fb5dbd9f,slideOutTopFrames-fb5dbd9f;
435
+ animation-name: fadeOutFrames-7e6a0b8d,slideOutTopFrames-7e6a0b8d;
436
436
  animation-fill-mode: both;
437
437
  }
438
- @keyframes slideInTopFrames-fb5dbd9f {
438
+ @keyframes slideInTopFrames-7e6a0b8d {
439
439
  from {
440
440
  transform: translate(0, -12px);
441
441
  animation-timing-function: cubic-bezier(0, 0, 0, 1);
@@ -444,7 +444,7 @@ to {
444
444
  transform: translate(0, 0);
445
445
  }
446
446
  }
447
- @keyframes slideOutTopFrames-fb5dbd9f {
447
+ @keyframes slideOutTopFrames-7e6a0b8d {
448
448
  from {
449
449
  transform: translate(0, 0);
450
450
  animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);
@@ -453,7 +453,7 @@ to {
453
453
  transform: translate(0, -12px);
454
454
  }
455
455
  }
456
- @keyframes fadeInFrames-fb5dbd9f {
456
+ @keyframes fadeInFrames-7e6a0b8d {
457
457
  from {
458
458
  opacity: 0;
459
459
  animation-timing-function: cubic-bezier(0, 0, 1, 1);
@@ -462,7 +462,7 @@ to {
462
462
  opacity: 1;
463
463
  }
464
464
  }
465
- @keyframes fadeOutFrames-fb5dbd9f {
465
+ @keyframes fadeOutFrames-7e6a0b8d {
466
466
  from {
467
467
  opacity: 1;
468
468
  animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pequity/squirrel",
3
3
  "description": "Squirrel component library",
4
- "version": "5.2.2",
4
+ "version": "5.3.0",
5
5
  "packageManager": "pnpm@9.11.0",
6
6
  "type": "module",
7
7
  "scripts": {
@@ -13,8 +13,8 @@
13
13
  "preview": "vite preview",
14
14
  "lint": "eslint \"**/*.{vue,ts,js}\"",
15
15
  "lint-fix": "eslint --fix \"**/*.{vue,ts,js}\"",
16
- "test:unit": "TZ=utc jest",
17
- "test:unit-coverage": "TZ=utc jest --coverage && make-coverage-badge",
16
+ "test:unit": "vitest",
17
+ "test:unit-coverage": "vitest run --coverage && make-coverage-badge",
18
18
  "typecheck": "vue-tsc --noEmit",
19
19
  "storybook": "storybook dev -p 6006",
20
20
  "build-storybook": "storybook build",
@@ -50,8 +50,6 @@
50
50
  "vue-toastification": "^2.0.0-rc.5"
51
51
  },
52
52
  "devDependencies": {
53
- "@babel/core": "^7.25.2",
54
- "@babel/preset-env": "^7.25.4",
55
53
  "@commitlint/cli": "^19.5.0",
56
54
  "@commitlint/config-conventional": "^19.5.0",
57
55
  "@pequity/eslint-config": "^0.0.13",
@@ -59,29 +57,27 @@
59
57
  "@popperjs/core": "2.11.8",
60
58
  "@semantic-release/changelog": "^6.0.3",
61
59
  "@semantic-release/git": "^10.0.1",
62
- "@storybook/addon-a11y": "^8.3.2",
63
- "@storybook/addon-actions": "^8.3.2",
64
- "@storybook/addon-essentials": "^8.3.2",
65
- "@storybook/addon-interactions": "^8.3.2",
66
- "@storybook/addon-links": "^8.3.2",
67
- "@storybook/blocks": "^8.3.2",
68
- "@storybook/manager-api": "^8.3.2",
69
- "@storybook/test": "^8.3.2",
60
+ "@storybook/addon-a11y": "^8.3.3",
61
+ "@storybook/addon-actions": "^8.3.3",
62
+ "@storybook/addon-essentials": "^8.3.3",
63
+ "@storybook/addon-interactions": "^8.3.3",
64
+ "@storybook/addon-links": "^8.3.3",
65
+ "@storybook/blocks": "^8.3.3",
66
+ "@storybook/manager-api": "^8.3.3",
67
+ "@storybook/test": "^8.3.3",
70
68
  "@storybook/test-runner": "^0.19.1",
71
- "@storybook/theming": "^8.3.2",
72
- "@storybook/vue3": "^8.3.2",
73
- "@storybook/vue3-vite": "^8.3.2",
69
+ "@storybook/theming": "^8.3.3",
70
+ "@storybook/vue3": "^8.3.3",
71
+ "@storybook/vue3-vite": "^8.3.3",
74
72
  "@tanstack/vue-virtual": "3.10.8",
75
- "@types/jest": "^29.5.13",
76
73
  "@types/jsdom": "^21.1.7",
77
74
  "@types/lodash-es": "^4.17.12",
78
- "@types/node": "^22.5.5",
75
+ "@types/node": "^22.7.2",
79
76
  "@vitejs/plugin-vue": "^5.1.4",
77
+ "@vitest/coverage-v8": "^2.1.1",
80
78
  "@vue/compiler-sfc": "3.4.38",
81
79
  "@vue/test-utils": "^2.4.6",
82
- "@vue/vue3-jest": "^29.2.6",
83
80
  "autoprefixer": "^10.4.20",
84
- "babel-jest": "^29.7.0",
85
81
  "dayjs": "1.11.13",
86
82
  "eslint": "^8.57.0",
87
83
  "eslint-plugin-storybook": "^0.8.0",
@@ -89,25 +85,24 @@
89
85
  "glob": "^11.0.0",
90
86
  "husky": "^9.1.6",
91
87
  "iconify-icon": "^2.1.0",
92
- "jest": "^29.7.0",
93
- "jest-environment-jsdom": "^29.7.0",
88
+ "jsdom": "^25.0.1",
94
89
  "lint-staged": "^15.2.10",
95
90
  "lodash-es": "4.17.21",
96
91
  "make-coverage-badge": "^1.2.0",
97
92
  "postcss": "^8.4.47",
98
93
  "prettier": "^3.3.3",
99
- "prettier-plugin-tailwindcss": "^0.6.6",
94
+ "prettier-plugin-tailwindcss": "^0.6.8",
100
95
  "resolve-tspaths": "^0.8.22",
101
96
  "rimraf": "^6.0.1",
102
97
  "sass": "^1.79.3",
103
98
  "semantic-release": "^24.1.1",
104
- "storybook": "^8.3.2",
99
+ "storybook": "^8.3.3",
105
100
  "svgo": "^3.3.2",
106
- "tailwindcss": "^3.4.12",
107
- "ts-jest": "^29.2.5",
101
+ "tailwindcss": "^3.4.13",
108
102
  "typescript": "5.6.2",
109
103
  "v-calendar": "3.1.2",
110
- "vite": "^5.4.7",
104
+ "vite": "^5.4.8",
105
+ "vitest": "^2.1.1",
111
106
  "vue": "3.4.38",
112
107
  "vue-currency-input": "3.1.0",
113
108
  "vue-router": "4.4.5",
@@ -1,26 +1,15 @@
1
1
  import PActionBar from '@squirrel/components/p-action-bar/p-action-bar.vue';
2
- import { createWrapperFor } from '@tests/jest.helpers';
2
+ import { createWrapperFor } from '@tests/vitest.helpers';
3
+ import { defineComponent } from 'vue';
3
4
 
4
5
  const createPDropdownStub = () => {
5
- return {
6
+ return defineComponent({
6
7
  name: 'PDropdownStub',
7
- template: `
8
- <div class="pdropdown-stub">
9
- <slot></slot>
10
- <div v-if="show" class="pdropdown-stub-popper">
11
- <slot name="popper"></slot>
12
- </div>
13
- </div>`,
14
8
  data() {
15
9
  return {
16
10
  show: false,
17
11
  };
18
12
  },
19
- methods: {
20
- toggleShow() {
21
- this.show = !this.show;
22
- },
23
- },
24
13
  async mounted() {
25
14
  const btn = this.$el.querySelector('button');
26
15
 
@@ -31,7 +20,19 @@ const createPDropdownStub = () => {
31
20
 
32
21
  btn.removeEventListener('click', this.toggleShow);
33
22
  },
34
- };
23
+ methods: {
24
+ toggleShow() {
25
+ this.show = !this.show;
26
+ },
27
+ },
28
+ template: `
29
+ <div class="p-dropdown-stub">
30
+ <slot></slot>
31
+ <div v-if="show" class="p-dropdown-stub-popper">
32
+ <slot name="popper"></slot>
33
+ </div>
34
+ </div>`,
35
+ });
35
36
  };
36
37
 
37
38
  const createComponentWrapper = (args = {}) =>
@@ -103,6 +104,37 @@ describe('PActionBar.vue', () => {
103
104
  expect(actionBtn.text()).toContain('Say Hi');
104
105
  });
105
106
 
107
+ it('renders p-icons', async () => {
108
+ const wrapper = createComponentWrapper({
109
+ props: {
110
+ show: true,
111
+ label: 'Hello World',
112
+ actions: [
113
+ { label: 'Say Hi', name: 'greet', icon: 'test-icon-1' },
114
+ {
115
+ label: 'Action menu',
116
+ icon: 'test-icon-2',
117
+ subActions: [{ label: 'Say Bye', name: 'bye', icon: 'test-icon-3' }],
118
+ },
119
+ ],
120
+ },
121
+ });
122
+
123
+ const mainDiv = await wrapper.find('.teleport-stub > .fixed.bottom-6');
124
+
125
+ await mainDiv.find('.p-dropdown-stub > button').trigger('click');
126
+
127
+ await wrapper.vm.$nextTick();
128
+
129
+ const icons = mainDiv.findAll('iconify-icon');
130
+
131
+ expect(icons.length).toBe(3);
132
+
133
+ expect(icons[0].attributes().icon).toBe('test-icon-1');
134
+ expect(icons[1].attributes().icon).toBe('test-icon-2');
135
+ expect(icons[2].attributes().icon).toBe('test-icon-3');
136
+ });
137
+
106
138
  it('attrs fall through ', async () => {
107
139
  const wrapper = createComponentWrapper({
108
140
  props: {
@@ -14,6 +14,7 @@ const actionBarActions = [
14
14
  },
15
15
  {
16
16
  label: 'Say Hi',
17
+ icon: 'delete',
17
18
  name: 'greet',
18
19
  },
19
20
  {
@@ -29,6 +30,11 @@ const actionBarActions = [
29
30
  name: 'subaction2',
30
31
  icon: PaginateRightIcon,
31
32
  },
33
+ {
34
+ label: 'Subaction 3',
35
+ name: 'subaction3',
36
+ icon: 'ph:android-logo',
37
+ },
32
38
  ],
33
39
  },
34
40
  ];
@@ -1,10 +1,12 @@
1
+ import { type Component } from 'vue';
2
+
1
3
  export type PActionBarAction = {
2
4
  name?: string;
3
5
  label: string;
4
- icon?: string;
6
+ icon?: string | Component;
5
7
  subActions?: {
6
8
  name: string;
7
9
  label: string;
8
- icon?: string;
10
+ icon?: string | Component;
9
11
  }[];
10
12
  };
@@ -16,14 +16,16 @@
16
16
  @click="$emit('click:action', actionOrMenu.name)"
17
17
  >
18
18
  <div class="flex items-center gap-2 px-1 py-0.5">
19
- <Component :is="actionOrMenu.icon" v-if="actionOrMenu.icon" class="h-4 w-4" />
19
+ <Component :is="actionOrMenu.icon" v-if="isComponent(actionOrMenu.icon)" class="h-4 w-4" />
20
+ <PIcon v-if="isString(actionOrMenu.icon)" :icon="actionOrMenu.icon" width="16px" height="16px" />
20
21
  <div>{{ actionOrMenu.label }}</div>
21
22
  </div>
22
23
  </PBtn>
23
24
  <PDropdown v-else placement="top" strategy="fixed">
24
25
  <PBtn size="sm" type="secondary-ghost-dark">
25
26
  <div class="flex items-center gap-2 px-1 py-0.5">
26
- <Component :is="actionOrMenu.icon" v-if="actionOrMenu.icon" class="h-4 w-4" />
27
+ <Component :is="actionOrMenu.icon" v-if="isComponent(actionOrMenu.icon)" class="h-4 w-4" />
28
+ <PIcon v-if="isString(actionOrMenu.icon)" :icon="actionOrMenu.icon" width="16px" height="16px" />
27
29
  <div>{{ actionOrMenu.label }}</div>
28
30
  </div>
29
31
  </PBtn>
@@ -37,7 +39,8 @@
37
39
  @click="$emit('click:action', subaction.name)"
38
40
  >
39
41
  <div class="flex items-center gap-2 px-1 py-0.5">
40
- <Component :is="subaction.icon" v-if="subaction.icon" class="h-4 w-4" />
42
+ <Component :is="subaction.icon" v-if="isComponent(subaction.icon)" class="h-4 w-4" />
43
+ <PIcon v-if="isString(subaction.icon)" :icon="subaction.icon" width="16px" height="16px" />
41
44
  <div>{{ subaction.label }}</div>
42
45
  </div>
43
46
  </PBtn>
@@ -56,7 +59,10 @@
56
59
  import PBtn from '@squirrel/components/p-btn/p-btn.vue';
57
60
  import PCloseBtn from '@squirrel/components/p-close-btn/p-close-btn.vue';
58
61
  import PDropdown from '@squirrel/components/p-dropdown/p-dropdown.vue';
62
+ import PIcon from '@squirrel/components/p-icon/p-icon.vue';
59
63
  import { type PActionBarAction } from '@squirrel/components/p-action-bar/p-action-bar.types';
64
+ import { isComponent } from '@squirrel/utils/component';
65
+ import { isString } from '@squirrel/utils/string';
60
66
 
61
67
  defineOptions({
62
68
  name: 'PActionBar',