@porsche-design-system/components-vue 3.29.0-rc.0 → 3.29.0-rc.1

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.
package/CHANGELOG.md CHANGED
@@ -14,9 +14,50 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0),
14
14
 
15
15
  ## [Unreleased]
16
16
 
17
+ ## [3.29.0-rc.1] - 2025-07-15
18
+
19
+ ### Added
20
+
21
+ - `Popover`: support for custom slotted button
22
+ ([#3861](https://github.com/porsche-design-system/porsche-design-system/pull/3861))
23
+ - `Icon`: `ai-spark` and `ai-spark-filled`
24
+ ([#3916](https://github.com/porsche-design-system/porsche-design-system/pull/3916))
25
+ - `Input Text`: `counter` prop functions independently of `max-length`, allowing character count display even when no
26
+ limit is set ([#3901](https://github.com/porsche-design-system/porsche-design-system/pull/3901))
27
+
28
+ ### Changed
29
+
30
+ - `Input Search`: `indicator` prop now defaults to `false`
31
+ ([#3917](https://github.com/porsche-design-system/porsche-design-system/pull/3917))
32
+ - Angular: updated peer dependency to `>=20.0.0 <21.0.0`
33
+ - **Breaking Change** `Textarea`:
34
+
35
+ - Renamed the `showCounter` prop to `counter`.
36
+ - Changed default behavior: the `counter` is now disabled by default (`false` instead of `true`).
37
+
38
+ ```diff
39
+ - <p-textarea name="some-name" showCounter="false"></p-textarea>
40
+ + <p-textarea name="some-name"></p-textarea>
41
+ ```
42
+
43
+ To enable the counter explicitly:
44
+
45
+ ```diff
46
+ - <p-textarea name="some-name"></p-textarea>
47
+ + <p-textarea name="some-name" counter="true"></p-textarea>
48
+ ```
49
+
50
+ ⚠️ This is a breaking change — you must update all instances using `showCounter`.
51
+ ([#3901](https://github.com/porsche-design-system/porsche-design-system/pull/3901))
52
+
53
+ ### Fixed
54
+
55
+ - `Carousel`: component does not work correctly if an invalid `lang` value is provided
56
+ ([#3924](https://github.com/porsche-design-system/porsche-design-system/pull/3924))
57
+
17
58
  ## [3.29.0-rc.0] - 2025-06-27
18
59
 
19
- #### Added
60
+ ### Added
20
61
 
21
62
  - `Input Search`: ([#3874](https://github.com/porsche-design-system/porsche-design-system/pull/3874))
22
63
  - `Input Number`, `Input Password`: added loading state
@@ -29,11 +70,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0),
29
70
 
30
71
  ## [3.28.0] - 2025-06-02
31
72
 
32
- #### Added
73
+ ### Added
33
74
 
34
75
  - `Input Number`: ([#3855](https://github.com/porsche-design-system/porsche-design-system/pull/3855))
35
76
 
36
- #### Fixed
77
+ ### Fixed
37
78
 
38
79
  - `Select Wrapper`: update of scroll position if dropdown is navigated with keyboard
39
80
  ([#3858](https://github.com/porsche-design-system/porsche-design-system/pull/3858))
@@ -1 +1 @@
1
- "use strict";const e=require("vue"),t=require("../../utils.cjs"),p=e.defineComponent({__name:"InputSearchWrapper",props:{autoComplete:{},clear:{type:Boolean,default:!1},compact:{type:Boolean,default:!1},description:{default:""},disabled:{type:Boolean,default:!1},form:{},hideLabel:{default:!1},indicator:{type:Boolean,default:!0},label:{default:""},loading:{type:Boolean,default:!1},message:{default:""},name:{},placeholder:{default:""},readOnly:{type:Boolean,default:!1},required:{type:Boolean,default:!1},state:{default:"none"},theme:{},value:{default:""}},emits:["blur","change","input"],setup(d,{emit:u}){const f=t.usePrefix("p-input-search"),a=d,n=e.ref(),o=u,s=e.inject(t.themeInjectionKey),r=()=>t.syncProperties(n,{...a,theme:a.theme||s.value});return e.onMounted(()=>{r(),t.addEventListenerToElementRef(n,"blur",o),t.addEventListenerToElementRef(n,"change",o),t.addEventListenerToElementRef(n,"input",o)}),e.onUpdated(r),e.watch(s,l=>{t.syncProperties(n,{theme:a.theme||l})}),(l,c)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(e.unref(f)),{ref_key:"pdsComponentRef",ref:n},{default:e.withCtx(()=>[e.renderSlot(l.$slots,"default")]),_:3},512))}});module.exports=p;
1
+ "use strict";const e=require("vue"),t=require("../../utils.cjs"),p=e.defineComponent({__name:"InputSearchWrapper",props:{autoComplete:{},clear:{type:Boolean,default:!1},compact:{type:Boolean,default:!1},description:{default:""},disabled:{type:Boolean,default:!1},form:{},hideLabel:{default:!1},indicator:{type:Boolean,default:!1},label:{default:""},loading:{type:Boolean,default:!1},message:{default:""},name:{},placeholder:{default:""},readOnly:{type:Boolean,default:!1},required:{type:Boolean,default:!1},state:{default:"none"},theme:{},value:{default:""}},emits:["blur","change","input"],setup(d,{emit:f}){const u=t.usePrefix("p-input-search"),a=d,n=e.ref(),o=f,s=e.inject(t.themeInjectionKey),r=()=>t.syncProperties(n,{...a,theme:a.theme||s.value});return e.onMounted(()=>{r(),t.addEventListenerToElementRef(n,"blur",o),t.addEventListenerToElementRef(n,"change",o),t.addEventListenerToElementRef(n,"input",o)}),e.onUpdated(r),e.watch(s,l=>{t.syncProperties(n,{theme:a.theme||l})}),(l,c)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(e.unref(u)),{ref_key:"pdsComponentRef",ref:n},{default:e.withCtx(()=>[e.renderSlot(l.$slots,"default")]),_:3},512))}});module.exports=p;
@@ -1 +1 @@
1
- "use strict";const e=require("vue"),t=require("../../utils.cjs"),m=e.defineComponent({__name:"PopoverWrapper",props:{aria:{},description:{},direction:{default:"bottom"},theme:{}},setup(c){const i=t.usePrefix("p-popover"),o=c,n=e.ref(),s=e.inject(t.themeInjectionKey),p=()=>t.syncProperties(n,{...o,theme:o.theme||s.value});return e.onMounted(p),e.onUpdated(p),e.watch(s,r=>{t.syncProperties(n,{theme:o.theme||r})}),(r,a)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(e.unref(i)),{ref_key:"pdsComponentRef",ref:n},{default:e.withCtx(()=>[e.renderSlot(r.$slots,"default")]),_:3},512))}});module.exports=m;
1
+ "use strict";const e=require("vue"),t=require("../../utils.cjs"),d=e.defineComponent({__name:"PopoverWrapper",props:{aria:{},description:{},direction:{default:"bottom"},open:{type:Boolean,default:!1},theme:{}},emits:["dismiss"],setup(i,{emit:c}){const m=t.usePrefix("p-popover"),n=i,o=e.ref(),a=c,r=e.inject(t.themeInjectionKey),p=()=>t.syncProperties(o,{...n,theme:n.theme||r.value});return e.onMounted(()=>{p(),t.addEventListenerToElementRef(o,"dismiss",a)}),e.onUpdated(p),e.watch(r,s=>{t.syncProperties(o,{theme:n.theme||s})}),(s,f)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(e.unref(m)),{ref_key:"pdsComponentRef",ref:o},{default:e.withCtx(()=>[e.renderSlot(s.$slots,"default")]),_:3},512))}});module.exports=d;
@@ -1 +1 @@
1
- "use strict";const e=require("vue"),t=require("../../utils.cjs"),p=e.defineComponent({__name:"TextareaWrapper",props:{autoComplete:{},description:{default:""},disabled:{type:Boolean,default:!1},form:{},hideLabel:{default:!1},label:{default:""},maxLength:{},message:{default:""},minLength:{},name:{},placeholder:{default:""},readOnly:{type:Boolean,default:!1},required:{type:Boolean,default:!1},resize:{default:"vertical"},rows:{default:7},showCounter:{type:Boolean,default:!0},spellCheck:{type:Boolean},state:{default:"none"},theme:{},value:{default:""},wrap:{default:"soft"}},emits:["blur","change","input"],setup(u,{emit:d}){const f=t.usePrefix("p-textarea"),o=u,n=e.ref(),a=d,r=e.inject(t.themeInjectionKey),s=()=>t.syncProperties(n,{...o,theme:o.theme||r.value});return e.onMounted(()=>{s(),t.addEventListenerToElementRef(n,"blur",a),t.addEventListenerToElementRef(n,"change",a),t.addEventListenerToElementRef(n,"input",a)}),e.onUpdated(s),e.watch(r,l=>{t.syncProperties(n,{theme:o.theme||l})}),(l,c)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(e.unref(f)),{ref_key:"pdsComponentRef",ref:n},{default:e.withCtx(()=>[e.renderSlot(l.$slots,"default")]),_:3},512))}});module.exports=p;
1
+ "use strict";const e=require("vue"),t=require("../../utils.cjs"),p=e.defineComponent({__name:"TextareaWrapper",props:{autoComplete:{},counter:{type:Boolean,default:!1},description:{default:""},disabled:{type:Boolean,default:!1},form:{},hideLabel:{default:!1},label:{default:""},maxLength:{},message:{default:""},minLength:{},name:{},placeholder:{default:""},readOnly:{type:Boolean,default:!1},required:{type:Boolean,default:!1},resize:{default:"vertical"},rows:{default:7},spellCheck:{type:Boolean},state:{default:"none"},theme:{},value:{default:""},wrap:{default:"soft"}},emits:["blur","change","input"],setup(d,{emit:f}){const u=t.usePrefix("p-textarea"),a=d,n=e.ref(),o=f,s=e.inject(t.themeInjectionKey),r=()=>t.syncProperties(n,{...a,theme:a.theme||s.value});return e.onMounted(()=>{r(),t.addEventListenerToElementRef(n,"blur",o),t.addEventListenerToElementRef(n,"change",o),t.addEventListenerToElementRef(n,"input",o)}),e.onUpdated(r),e.watch(s,l=>{t.syncProperties(n,{theme:a.theme||l})}),(l,c)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(e.unref(u)),{ref_key:"pdsComponentRef",ref:n},{default:e.withCtx(()=>[e.renderSlot(l.$slots,"default")]),_:3},512))}});module.exports=p;
@@ -1,5 +1,5 @@
1
1
  import { defineComponent as u, ref as c, inject as m, onMounted as i, onUpdated as h, watch as y, openBlock as B, createBlock as C, resolveDynamicComponent as _, unref as b, withCtx as g, renderSlot as v } from "vue";
2
- import { usePrefix as R, themeInjectionKey as k, addEventListenerToElementRef as n, syncProperties as f } from "../../utils.mjs";
2
+ import { usePrefix as R, themeInjectionKey as k, addEventListenerToElementRef as n, syncProperties as r } from "../../utils.mjs";
3
3
  const j = /* @__PURE__ */ u({
4
4
  __name: "InputSearchWrapper",
5
5
  props: {
@@ -10,7 +10,7 @@ const j = /* @__PURE__ */ u({
10
10
  disabled: { type: Boolean, default: !1 },
11
11
  form: {},
12
12
  hideLabel: { default: !1 },
13
- indicator: { type: Boolean, default: !0 },
13
+ indicator: { type: Boolean, default: !1 },
14
14
  label: { default: "" },
15
15
  loading: { type: Boolean, default: !1 },
16
16
  message: { default: "" },
@@ -23,12 +23,12 @@ const j = /* @__PURE__ */ u({
23
23
  value: { default: "" }
24
24
  },
25
25
  emits: ["blur", "change", "input"],
26
- setup(p, { emit: s }) {
27
- const d = R("p-input-search"), t = p, e = c(), a = s, l = m(k), r = () => f(e, { ...t, theme: t.theme || l.value });
26
+ setup(s, { emit: p }) {
27
+ const d = R("p-input-search"), t = s, e = c(), a = p, l = m(k), f = () => r(e, { ...t, theme: t.theme || l.value });
28
28
  return i(() => {
29
- r(), n(e, "blur", a), n(e, "change", a), n(e, "input", a);
30
- }), h(r), y(l, (o) => {
31
- f(e, { theme: t.theme || o });
29
+ f(), n(e, "blur", a), n(e, "change", a), n(e, "input", a);
30
+ }), h(f), y(l, (o) => {
31
+ r(e, { theme: t.theme || o });
32
32
  }), (o, w) => (B(), C(_(b(d)), {
33
33
  ref_key: "pdsComponentRef",
34
34
  ref: e
@@ -12,6 +12,10 @@ type PPopoverProps = {
12
12
  * Preferred direction in which popover should open, given there is enough space in viewport. Otherwise, it will be opened in the direction with most available space.
13
13
  */
14
14
  direction?: PopoverDirection;
15
+ /**
16
+ * If true, the popover is open.
17
+ */
18
+ open?: boolean;
15
19
  /**
16
20
  * Adapts the popover color depending on the theme.
17
21
  */
@@ -20,7 +24,8 @@ type PPopoverProps = {
20
24
  declare function __VLS_template(): {
21
25
  default?(_: {}): any;
22
26
  };
23
- declare const __VLS_component: import("vue").DefineComponent<PPopoverProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<PPopoverProps> & Readonly<{}>, {
27
+ declare const __VLS_component: import("vue").DefineComponent<PPopoverProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, any, string, import("vue").PublicProps, any, {
28
+ open: boolean;
24
29
  direction: PopoverDirection;
25
30
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
26
31
  declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, ReturnType<typeof __VLS_template>>;
@@ -1,28 +1,32 @@
1
- import { defineComponent as m, ref as a, inject as f, onMounted as i, onUpdated as d, watch as u, openBlock as h, createBlock as l, resolveDynamicComponent as _, unref as C, withCtx as y, renderSlot as v } from "vue";
2
- import { usePrefix as P, themeInjectionKey as k, syncProperties as p } from "../../utils.mjs";
3
- const b = /* @__PURE__ */ m({
1
+ import { defineComponent as c, ref as f, inject as d, onMounted as l, onUpdated as u, watch as h, openBlock as _, createBlock as y, resolveDynamicComponent as C, unref as v, withCtx as P, renderSlot as R } from "vue";
2
+ import { usePrefix as k, themeInjectionKey as w, addEventListenerToElementRef as x, syncProperties as r } from "../../utils.mjs";
3
+ const E = /* @__PURE__ */ c({
4
4
  __name: "PopoverWrapper",
5
5
  props: {
6
6
  aria: {},
7
7
  description: {},
8
8
  direction: { default: "bottom" },
9
+ open: { type: Boolean, default: !1 },
9
10
  theme: {}
10
11
  },
11
- setup(s) {
12
- const c = P("p-popover"), e = s, o = a(), n = f(k), r = () => p(o, { ...e, theme: e.theme || n.value });
13
- return i(r), d(r), u(n, (t) => {
14
- p(o, { theme: e.theme || t });
15
- }), (t, w) => (h(), l(_(C(c)), {
12
+ emits: ["dismiss"],
13
+ setup(p, { emit: m }) {
14
+ const i = k("p-popover"), t = p, e = f(), a = m, n = d(w), s = () => r(e, { ...t, theme: t.theme || n.value });
15
+ return l(() => {
16
+ s(), x(e, "dismiss", a);
17
+ }), u(s), h(n, (o) => {
18
+ r(e, { theme: t.theme || o });
19
+ }), (o, B) => (_(), y(C(v(i)), {
16
20
  ref_key: "pdsComponentRef",
17
- ref: o
21
+ ref: e
18
22
  }, {
19
- default: y(() => [
20
- v(t.$slots, "default")
23
+ default: P(() => [
24
+ R(o.$slots, "default")
21
25
  ]),
22
26
  _: 3
23
27
  }, 512));
24
28
  }
25
29
  });
26
30
  export {
27
- b as default
31
+ E as default
28
32
  };
@@ -4,6 +4,10 @@ type PTextareaProps = {
4
4
  * Specifies whether the input can be autofilled by the browser
5
5
  */
6
6
  autoComplete?: TextareaAutoComplete;
7
+ /**
8
+ * Show or hide the character counter.
9
+ */
10
+ counter?: boolean;
7
11
  /**
8
12
  * The description text.
9
13
  */
@@ -60,10 +64,6 @@ type PTextareaProps = {
60
64
  * The number of rows of the textarea.
61
65
  */
62
66
  rows?: number;
63
- /**
64
- * Show or hide max character count.
65
- */
66
- showCounter?: boolean;
67
67
  /**
68
68
  * Specifies whether the input should have its spelling and grammar checked
69
69
  */
@@ -109,7 +109,7 @@ declare const __VLS_component: import("vue").DefineComponent<PTextareaProps, {},
109
109
  message: string;
110
110
  placeholder: string;
111
111
  readOnly: boolean;
112
- showCounter: boolean;
112
+ counter: boolean;
113
113
  rows: number;
114
114
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
115
115
  declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, ReturnType<typeof __VLS_template>>;
@@ -1,9 +1,10 @@
1
- import { defineComponent as u, ref as m, inject as c, onMounted as i, onUpdated as h, watch as y, openBlock as C, createBlock as B, resolveDynamicComponent as _, unref as b, withCtx as g, renderSlot as w } from "vue";
2
- import { usePrefix as x, themeInjectionKey as v, addEventListenerToElementRef as n, syncProperties as s } from "../../utils.mjs";
1
+ import { defineComponent as u, ref as m, inject as c, onMounted as i, onUpdated as h, watch as y, openBlock as C, createBlock as B, resolveDynamicComponent as _, unref as b, withCtx as g, renderSlot as x } from "vue";
2
+ import { usePrefix as v, themeInjectionKey as w, addEventListenerToElementRef as n, syncProperties as s } from "../../utils.mjs";
3
3
  const P = /* @__PURE__ */ u({
4
4
  __name: "TextareaWrapper",
5
5
  props: {
6
6
  autoComplete: {},
7
+ counter: { type: Boolean, default: !1 },
7
8
  description: { default: "" },
8
9
  disabled: { type: Boolean, default: !1 },
9
10
  form: {},
@@ -18,7 +19,6 @@ const P = /* @__PURE__ */ u({
18
19
  required: { type: Boolean, default: !1 },
19
20
  resize: { default: "vertical" },
20
21
  rows: { default: 7 },
21
- showCounter: { type: Boolean, default: !0 },
22
22
  spellCheck: { type: Boolean },
23
23
  state: { default: "none" },
24
24
  theme: {},
@@ -27,7 +27,7 @@ const P = /* @__PURE__ */ u({
27
27
  },
28
28
  emits: ["blur", "change", "input"],
29
29
  setup(f, { emit: p }) {
30
- const d = x("p-textarea"), t = f, e = m(), a = p, l = c(v), r = () => s(e, { ...t, theme: t.theme || l.value });
30
+ const d = v("p-textarea"), t = f, e = m(), a = p, l = c(w), r = () => s(e, { ...t, theme: t.theme || l.value });
31
31
  return i(() => {
32
32
  r(), n(e, "blur", a), n(e, "change", a), n(e, "input", a);
33
33
  }), h(r), y(l, (o) => {
@@ -37,7 +37,7 @@ const P = /* @__PURE__ */ u({
37
37
  ref: e
38
38
  }, {
39
39
  default: g(() => [
40
- w(o.$slots, "default")
40
+ x(o.$slots, "default")
41
41
  ]),
42
42
  _: 3
43
43
  }, 512));
@@ -221,6 +221,8 @@ declare const ICON_NAMES: readonly [
221
221
  "add",
222
222
  "adjust",
223
223
  "aggregation",
224
+ "ai-spark",
225
+ "ai-spark-filled",
224
226
  "arrow-compact-down",
225
227
  "arrow-compact-left",
226
228
  "arrow-compact-right",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@porsche-design-system/components-vue",
3
- "version": "3.29.0-rc.0",
3
+ "version": "3.29.0-rc.1",
4
4
  "description": "Porsche Design System is a component library designed to help developers create the best experience for software or services distributed by Dr. Ing. h.c. F. Porsche AG.",
5
5
  "keywords": [
6
6
  "porsche",
@@ -17,7 +17,7 @@
17
17
  "license": "SEE LICENSE IN LICENSE",
18
18
  "homepage": "https://designsystem.porsche.com",
19
19
  "dependencies": {
20
- "@porsche-design-system/components-js": "3.29.0-rc.0"
20
+ "@porsche-design-system/components-js": "3.29.0-rc.1"
21
21
  },
22
22
  "peerDependencies": {
23
23
  "ag-grid-enterprise": ">= 33.0.0 <34.0.0",