@salla.sa/ui-ai-kit-core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/ai-card.cjs.entry.js +25 -0
  3. package/dist/cjs/ai-chat-container.cjs.entry.js +138 -0
  4. package/dist/cjs/ai-chat-header.cjs.entry.js +79 -0
  5. package/dist/cjs/ai-chat-message.cjs.entry.js +164 -0
  6. package/dist/cjs/ai-icon.cjs.entry.js +25 -0
  7. package/dist/cjs/ai-link.cjs.entry.js +34 -0
  8. package/dist/cjs/ai-loading.cjs.entry.js +77 -0
  9. package/dist/cjs/ai-message-input.cjs.entry.js +65 -0
  10. package/dist/cjs/ai-rating.cjs.entry.js +57 -0
  11. package/dist/cjs/ai-suggestion.cjs.entry.js +31 -0
  12. package/dist/cjs/ai-voice-input.cjs.entry.js +233 -0
  13. package/dist/cjs/icon-registry-dmfLA-Dj.js +82 -0
  14. package/dist/cjs/index-DLJcLHFH.js +1622 -0
  15. package/dist/cjs/index.cjs.js +7 -0
  16. package/dist/cjs/loader.cjs.js +12 -0
  17. package/dist/cjs/ui-ai-kit.cjs.js +24 -0
  18. package/dist/collection/collection-manifest.json +23 -0
  19. package/dist/collection/components/ai-card/ai-card.css +40 -0
  20. package/dist/collection/components/ai-card/ai-card.js +70 -0
  21. package/dist/collection/components/ai-card/ai-card.stories.js +52 -0
  22. package/dist/collection/components/ai-chat-container/ai-chat-container.css +137 -0
  23. package/dist/collection/components/ai-chat-container/ai-chat-container.js +270 -0
  24. package/dist/collection/components/ai-chat-container/ai-chat-container.stories.js +160 -0
  25. package/dist/collection/components/ai-chat-header/ai-chat-header.css +186 -0
  26. package/dist/collection/components/ai-chat-header/ai-chat-header.js +311 -0
  27. package/dist/collection/components/ai-chat-header/ai-chat-header.stories.js +138 -0
  28. package/dist/collection/components/ai-chat-message/ai-chat-message.css +304 -0
  29. package/dist/collection/components/ai-chat-message/ai-chat-message.js +379 -0
  30. package/dist/collection/components/ai-chat-message/ai-chat-message.stories.js +164 -0
  31. package/dist/collection/components/ai-icon/ai-icon.css +9 -0
  32. package/dist/collection/components/ai-icon/ai-icon.js +76 -0
  33. package/dist/collection/components/ai-link/ai-link.css +62 -0
  34. package/dist/collection/components/ai-link/ai-link.js +119 -0
  35. package/dist/collection/components/ai-link/ai-link.stories.js +79 -0
  36. package/dist/collection/components/ai-loading/ai-loading.css +202 -0
  37. package/dist/collection/components/ai-loading/ai-loading.js +244 -0
  38. package/dist/collection/components/ai-loading/ai-loading.stories.js +145 -0
  39. package/dist/collection/components/ai-message-input/ai-message-input.css +175 -0
  40. package/dist/collection/components/ai-message-input/ai-message-input.js +192 -0
  41. package/dist/collection/components/ai-message-input/ai-message-input.stories.js +125 -0
  42. package/dist/collection/components/ai-rating/ai-rating.css +145 -0
  43. package/dist/collection/components/ai-rating/ai-rating.js +176 -0
  44. package/dist/collection/components/ai-rating/ai-rating.stories.js +78 -0
  45. package/dist/collection/components/ai-suggestion/ai-suggestion.css +69 -0
  46. package/dist/collection/components/ai-suggestion/ai-suggestion.js +93 -0
  47. package/dist/collection/components/ai-suggestion/ai-suggestion.stories.js +62 -0
  48. package/dist/collection/components/ai-voice-input/ai-voice-input.css +136 -0
  49. package/dist/collection/components/ai-voice-input/ai-voice-input.js +341 -0
  50. package/dist/collection/components/ai-voice-input/ai-voice-input.stories.js +118 -0
  51. package/dist/collection/index.js +10 -0
  52. package/dist/collection/utils/icon-registry.js +78 -0
  53. package/dist/collection/utils/utils.js +3 -0
  54. package/dist/components/ai-card.d.ts +11 -0
  55. package/dist/components/ai-card.js +1 -0
  56. package/dist/components/ai-chat-container.d.ts +11 -0
  57. package/dist/components/ai-chat-container.js +1 -0
  58. package/dist/components/ai-chat-header.d.ts +11 -0
  59. package/dist/components/ai-chat-header.js +1 -0
  60. package/dist/components/ai-chat-message.d.ts +11 -0
  61. package/dist/components/ai-chat-message.js +1 -0
  62. package/dist/components/ai-icon.d.ts +11 -0
  63. package/dist/components/ai-icon.js +1 -0
  64. package/dist/components/ai-link.d.ts +11 -0
  65. package/dist/components/ai-link.js +1 -0
  66. package/dist/components/ai-loading.d.ts +11 -0
  67. package/dist/components/ai-loading.js +1 -0
  68. package/dist/components/ai-message-input.d.ts +11 -0
  69. package/dist/components/ai-message-input.js +1 -0
  70. package/dist/components/ai-rating.d.ts +11 -0
  71. package/dist/components/ai-rating.js +1 -0
  72. package/dist/components/ai-suggestion.d.ts +11 -0
  73. package/dist/components/ai-suggestion.js +1 -0
  74. package/dist/components/ai-voice-input.d.ts +11 -0
  75. package/dist/components/ai-voice-input.js +1 -0
  76. package/dist/components/index.d.ts +35 -0
  77. package/dist/components/index.js +1 -0
  78. package/dist/components/p-CWjXxYJI.js +1 -0
  79. package/dist/components/p-CY6emva2.js +1 -0
  80. package/dist/components/p-DYv5ef4M.js +1 -0
  81. package/dist/esm/ai-card.entry.js +23 -0
  82. package/dist/esm/ai-chat-container.entry.js +136 -0
  83. package/dist/esm/ai-chat-header.entry.js +77 -0
  84. package/dist/esm/ai-chat-message.entry.js +162 -0
  85. package/dist/esm/ai-icon.entry.js +23 -0
  86. package/dist/esm/ai-link.entry.js +32 -0
  87. package/dist/esm/ai-loading.entry.js +75 -0
  88. package/dist/esm/ai-message-input.entry.js +63 -0
  89. package/dist/esm/ai-rating.entry.js +55 -0
  90. package/dist/esm/ai-suggestion.entry.js +29 -0
  91. package/dist/esm/ai-voice-input.entry.js +231 -0
  92. package/dist/esm/icon-registry-DYv5ef4M.js +80 -0
  93. package/dist/esm/index-7hrZ8FOQ.js +1612 -0
  94. package/dist/esm/index.js +5 -0
  95. package/dist/esm/loader.js +10 -0
  96. package/dist/esm/ui-ai-kit.js +20 -0
  97. package/dist/index.cjs.js +1 -0
  98. package/dist/index.js +1 -0
  99. package/dist/types/components/ai-card/ai-card.d.ts +7 -0
  100. package/dist/types/components/ai-card/ai-card.stories.d.ts +7 -0
  101. package/dist/types/components/ai-chat-container/ai-chat-container.d.ts +28 -0
  102. package/dist/types/components/ai-chat-container/ai-chat-container.stories.d.ts +7 -0
  103. package/dist/types/components/ai-chat-header/ai-chat-header.d.ts +38 -0
  104. package/dist/types/components/ai-chat-header/ai-chat-header.stories.d.ts +8 -0
  105. package/dist/types/components/ai-chat-message/ai-chat-message.d.ts +27 -0
  106. package/dist/types/components/ai-chat-message/ai-chat-message.stories.d.ts +10 -0
  107. package/dist/types/components/ai-icon/ai-icon.d.ts +8 -0
  108. package/dist/types/components/ai-link/ai-link.d.ts +12 -0
  109. package/dist/types/components/ai-link/ai-link.stories.d.ts +8 -0
  110. package/dist/types/components/ai-loading/ai-loading.d.ts +33 -0
  111. package/dist/types/components/ai-loading/ai-loading.stories.d.ts +10 -0
  112. package/dist/types/components/ai-message-input/ai-message-input.d.ts +22 -0
  113. package/dist/types/components/ai-message-input/ai-message-input.stories.d.ts +13 -0
  114. package/dist/types/components/ai-rating/ai-rating.d.ts +17 -0
  115. package/dist/types/components/ai-rating/ai-rating.stories.d.ts +8 -0
  116. package/dist/types/components/ai-suggestion/ai-suggestion.d.ts +10 -0
  117. package/dist/types/components/ai-suggestion/ai-suggestion.stories.d.ts +8 -0
  118. package/dist/types/components/ai-voice-input/ai-voice-input.d.ts +43 -0
  119. package/dist/types/components/ai-voice-input/ai-voice-input.stories.d.ts +9 -0
  120. package/dist/types/components.d.ts +860 -0
  121. package/dist/types/index.d.ts +11 -0
  122. package/dist/types/stencil-public-runtime.d.ts +1860 -0
  123. package/dist/types/utils/icon-registry.d.ts +5 -0
  124. package/dist/types/utils/utils.d.ts +1 -0
  125. package/dist/ui-ai-kit/index.esm.js +1 -0
  126. package/dist/ui-ai-kit/p-11facfad.entry.js +1 -0
  127. package/dist/ui-ai-kit/p-128a2ed4.entry.js +1 -0
  128. package/dist/ui-ai-kit/p-227bdb8f.entry.js +1 -0
  129. package/dist/ui-ai-kit/p-455daa17.entry.js +1 -0
  130. package/dist/ui-ai-kit/p-56163e8c.entry.js +1 -0
  131. package/dist/ui-ai-kit/p-6d21d0fd.entry.js +1 -0
  132. package/dist/ui-ai-kit/p-6ddcd77b.entry.js +1 -0
  133. package/dist/ui-ai-kit/p-7hrZ8FOQ.js +2 -0
  134. package/dist/ui-ai-kit/p-8e90143e.entry.js +1 -0
  135. package/dist/ui-ai-kit/p-9938c277.entry.js +1 -0
  136. package/dist/ui-ai-kit/p-DYv5ef4M.js +1 -0
  137. package/dist/ui-ai-kit/p-dc5b4a7f.entry.js +1 -0
  138. package/dist/ui-ai-kit/p-fb1702de.entry.js +1 -0
  139. package/dist/ui-ai-kit/ui-ai-kit.css +1 -0
  140. package/dist/ui-ai-kit/ui-ai-kit.esm.js +1 -0
  141. package/loader/cdn.js +1 -0
  142. package/loader/index.cjs.js +1 -0
  143. package/loader/index.d.ts +24 -0
  144. package/loader/index.es2017.js +1 -0
  145. package/loader/index.js +2 -0
  146. package/package.json +77 -0
  147. package/readme.md +111 -0
@@ -0,0 +1,62 @@
1
+ /* ─── Custom Properties ──────────────────────────────────────────────────── */
2
+ :host {
3
+ --ai-link-color: var(--ai-accent-dark);
4
+ --ai-link-color-hover: var(--ai-accent-dark);
5
+ --ai-link-font-size: 14px;
6
+ --ai-link-font-weight: 700;
7
+ --ai-link-line-height: 20px;
8
+ --ai-link-gap: 4px;
9
+ --ai-link-icon-size: 16px;
10
+
11
+ display: flex;
12
+ align-items: center;
13
+ gap: var(--ai-link-gap);
14
+ direction: rtl;
15
+ font-family: var(--ai-font-family, 'PingARLT', sans-serif);
16
+ }
17
+
18
+ /* ─── Anchor ─────────────────────────────────────────────────────────────── */
19
+ .link {
20
+ display: inline-flex;
21
+ align-items: center;
22
+ justify-content: flex-end;
23
+ gap: var(--ai-link-gap);
24
+ color: var(--ai-link-color);
25
+ font-size: var(--ai-link-font-size);
26
+ font-weight: var(--ai-link-font-weight);
27
+ font-family: inherit;
28
+ line-height: var(--ai-link-line-height);
29
+ text-decoration: none;
30
+ white-space: nowrap;
31
+ cursor: pointer;
32
+ transition: color 0.15s ease;
33
+ outline: none;
34
+ }
35
+
36
+ .link:hover {
37
+ color: var(--ai-link-color-hover);
38
+ text-decoration: underline;
39
+ }
40
+
41
+ .link:focus-visible {
42
+ outline: 2px solid var(--ai-accent);
43
+ outline-offset: 2px;
44
+ border-radius: 4px;
45
+ }
46
+
47
+ /* ─── Icon ───────────────────────────────────────────────────────────────── */
48
+ .link__icon {
49
+ display: inline-flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ width: var(--ai-link-icon-size);
53
+ height: var(--ai-link-icon-size);
54
+ flex-shrink: 0;
55
+ line-height: 0;
56
+ }
57
+
58
+ /* ─── Label ──────────────────────────────────────────────────────────────── */
59
+ .link__label {
60
+ color: var(--ai-link-color);
61
+ font-weight: bold;
62
+ }
@@ -0,0 +1,119 @@
1
+ import { Host, h } from "@stencil/core";
2
+ import { iconRegistry } from "../../utils/icon-registry";
3
+ export class AiLink {
4
+ /** Link display label */
5
+ label = '';
6
+ /** Href URL */
7
+ href = '#';
8
+ /** Link target */
9
+ target = '_blank';
10
+ /** Rel attribute — defaults to noopener noreferrer for _blank */
11
+ rel = '';
12
+ renderShareIcon() {
13
+ const icon = iconRegistry['share'];
14
+ if (!icon)
15
+ return null;
16
+ const svg = `<svg width="16" height="16" viewBox="${icon.viewBox}" fill="none" xmlns="http://www.w3.org/2000/svg">${icon.content}</svg>`;
17
+ return h("span", { class: "link__icon", innerHTML: svg });
18
+ }
19
+ render() {
20
+ const rel = this.rel || (this.target === '_blank' ? 'noopener noreferrer' : undefined);
21
+ return (h(Host, { key: '58a742b11ef7dcc1094031e804be6032311cea9d' }, h("span", { key: 'bf45468deb328c2d8ed70ac299d36968c16ababe', class: "link__label" }, this.label, h("slot", { key: 'bd43bc12d120ab806c895922ede0a08d4ec2f882' })), h("a", { key: 'b7c75a59bf18b1f1dc2e713b9e78c045afaa82e2', class: "link", href: this.href, target: this.target, rel: rel }, this.renderShareIcon())));
22
+ }
23
+ static get is() { return "ai-link"; }
24
+ static get encapsulation() { return "shadow"; }
25
+ static get originalStyleUrls() {
26
+ return {
27
+ "$": ["ai-link.css"]
28
+ };
29
+ }
30
+ static get styleUrls() {
31
+ return {
32
+ "$": ["ai-link.css"]
33
+ };
34
+ }
35
+ static get properties() {
36
+ return {
37
+ "label": {
38
+ "type": "string",
39
+ "mutable": false,
40
+ "complexType": {
41
+ "original": "string",
42
+ "resolved": "string",
43
+ "references": {}
44
+ },
45
+ "required": false,
46
+ "optional": false,
47
+ "docs": {
48
+ "tags": [],
49
+ "text": "Link display label"
50
+ },
51
+ "getter": false,
52
+ "setter": false,
53
+ "reflect": false,
54
+ "attribute": "label",
55
+ "defaultValue": "''"
56
+ },
57
+ "href": {
58
+ "type": "string",
59
+ "mutable": false,
60
+ "complexType": {
61
+ "original": "string",
62
+ "resolved": "string",
63
+ "references": {}
64
+ },
65
+ "required": false,
66
+ "optional": false,
67
+ "docs": {
68
+ "tags": [],
69
+ "text": "Href URL"
70
+ },
71
+ "getter": false,
72
+ "setter": false,
73
+ "reflect": false,
74
+ "attribute": "href",
75
+ "defaultValue": "'#'"
76
+ },
77
+ "target": {
78
+ "type": "string",
79
+ "mutable": false,
80
+ "complexType": {
81
+ "original": "'_blank' | '_self' | '_parent' | '_top'",
82
+ "resolved": "\"_blank\" | \"_parent\" | \"_self\" | \"_top\"",
83
+ "references": {}
84
+ },
85
+ "required": false,
86
+ "optional": false,
87
+ "docs": {
88
+ "tags": [],
89
+ "text": "Link target"
90
+ },
91
+ "getter": false,
92
+ "setter": false,
93
+ "reflect": false,
94
+ "attribute": "target",
95
+ "defaultValue": "'_blank'"
96
+ },
97
+ "rel": {
98
+ "type": "string",
99
+ "mutable": false,
100
+ "complexType": {
101
+ "original": "string",
102
+ "resolved": "string",
103
+ "references": {}
104
+ },
105
+ "required": false,
106
+ "optional": false,
107
+ "docs": {
108
+ "tags": [],
109
+ "text": "Rel attribute \u2014 defaults to noopener noreferrer for _blank"
110
+ },
111
+ "getter": false,
112
+ "setter": false,
113
+ "reflect": false,
114
+ "attribute": "rel",
115
+ "defaultValue": "''"
116
+ }
117
+ };
118
+ }
119
+ }
@@ -0,0 +1,79 @@
1
+ import { html } from "lit";
2
+ const meta = {
3
+ title: 'UI/Link',
4
+ component: 'ai-link',
5
+ tags: ['autodocs'],
6
+ argTypes: {
7
+ label: { control: 'text' },
8
+ href: { control: 'text' },
9
+ target: {
10
+ control: { type: 'select' },
11
+ options: ['_blank', '_self'],
12
+ },
13
+ },
14
+ };
15
+ export default meta;
16
+ const wrapStyle = 'padding: 24px; background: #f3f4f6; direction: rtl;';
17
+ /* ─── Playground ─────────────────────────────────────────────────────────── */
18
+ export const Playground = {
19
+ render: args => html `
20
+ <div style="${wrapStyle}">
21
+ <ai-link
22
+ label="${args.label}"
23
+ href="${args.href}"
24
+ target="${args.target}"
25
+ ></ai-link>
26
+ </div>
27
+ `,
28
+ args: {
29
+ label: 'صفحة الباقات',
30
+ href: '#',
31
+ target: '_blank',
32
+ },
33
+ };
34
+ /* ─── Multiple links ─────────────────────────────────────────────────────── */
35
+ export const MultipleLinks = {
36
+ render: () => html `
37
+ <div style="${wrapStyle} display: flex; flex-direction: column; gap: 12px; align-items: flex-end;">
38
+ <ai-link label="صفحة الباقات" href="#"></ai-link>
39
+ <ai-link label="لوحة التحكم" href="#"></ai-link>
40
+ <ai-link label="إعدادات المتجر" href="#"></ai-link>
41
+ </div>
42
+ `,
43
+ };
44
+ /* ─── Inside a card (realistic usage) ───────────────────────────────────── */
45
+ export const InsideCard = {
46
+ render: () => html `
47
+ <div style="padding: 24px; background: #f3f4f6; direction: rtl; max-width: 420px;">
48
+ <ai-card>
49
+ <p style="margin:0; font-size:14px; font-weight:500; color:#333;">
50
+ يمكنك الاطلاع على تفاصيل الباقات المتاحة
51
+ </p>
52
+ <p style="margin:0; font-size:14px; color:#737373;">
53
+ باقة بلس توفر ميزات متقدمة للتسويق وإدارة العملاء.
54
+ </p>
55
+ <ai-link label="صفحة الباقات" href="#"></ai-link>
56
+ </ai-card>
57
+ </div>
58
+ `,
59
+ };
60
+ /* ─── In message context (card + link + suggestions) ────────────────────── */
61
+ export const FullMessageContext = {
62
+ render: () => html `
63
+ <div style="padding: 24px; background: #f3f4f6; direction: rtl; max-width: 480px; display: flex; flex-direction: column; gap: 12px;">
64
+ <ai-card>
65
+ <p style="margin:0; font-size:14px; font-weight:500; color:#333;">
66
+ الفرق بين باقة بلس وبرو
67
+ </p>
68
+ <p style="margin:0; font-size:14px; color:#737373;">
69
+ باقة بلس مناسبة للمتاجر الناشئة، بينما باقة برو توفر أدوات تسويق متقدمة وتقارير تفصيلية.
70
+ </p>
71
+ <ai-link label="صفحة الباقات" href="#"></ai-link>
72
+ </ai-card>
73
+ <div style="display: flex; gap: 8px; flex-wrap: wrap;">
74
+ <ai-suggestion label="قارن الأسعار"></ai-suggestion>
75
+ <ai-suggestion label="كيف أرقي باقتي؟"></ai-suggestion>
76
+ </div>
77
+ </div>
78
+ `,
79
+ };
@@ -0,0 +1,202 @@
1
+ :host {
2
+ display: block;
3
+ direction: rtl;
4
+ }
5
+
6
+ /* ── Icon wrapper ───────────────────────────────────────── */
7
+ .icon-wrap {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ line-height: 0;
12
+ }
13
+
14
+ /* ── Sparkle avatar ─────────────────────────────────────── */
15
+ .sparkle-avatar {
16
+ width: 24px;
17
+ height: 24px;
18
+ border-radius: 9999px;
19
+ background: var(--ai-bg-card, #FCFCFC);
20
+ box-shadow: inset 0px 0px 3px 1px rgba(18, 18, 23, 0.06);
21
+ display: flex;
22
+ align-items: center;
23
+ justify-content: center;
24
+ flex-shrink: 0;
25
+ color: var(--ai-amber);
26
+ }
27
+
28
+ /* ── Thinking mode ──────────────────────────────────────── */
29
+ .thinking-row {
30
+ display: inline-flex;
31
+ align-items: center;
32
+ gap: 8px;
33
+ flex-direction: row;
34
+ }
35
+
36
+ @keyframes shimmer {
37
+ 0% {
38
+ background-position: 200% center;
39
+ }
40
+ 100% {
41
+ background-position: -200% center;
42
+ }
43
+ }
44
+
45
+ .shimmer-text {
46
+ font-size: 14px;
47
+ font-weight: 400;
48
+ line-height: 1.5;
49
+ background: var(--ai-glow-gradient, linear-gradient(90deg, #737373 0%, #c5c5c5 50%, #737373 100%));
50
+ background-size: 200% auto;
51
+ -webkit-background-clip: text;
52
+ -webkit-text-fill-color: transparent;
53
+ background-clip: text;
54
+ animation: shimmer 2s linear infinite;
55
+ }
56
+
57
+ /* ── Steps card ─────────────────────────────────────────── */
58
+ .steps-card {
59
+ background: var(--ai-bg-card, #ffffff);
60
+ border: 1px solid var(--ai-border-default, #eeeeee);
61
+ border-radius: 16px;
62
+ box-shadow: 0px 1px 2px 0px rgba(18, 18, 23, 0.05);
63
+ overflow: hidden;
64
+ }
65
+
66
+ /* ── Steps header ───────────────────────────────────────── */
67
+ .steps-header {
68
+ padding: 16px;
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 8px;
72
+ border-bottom: 1px solid var(--ai-border-default, #eeeeee);
73
+ }
74
+
75
+ .steps-header.collapsible {
76
+ cursor: pointer;
77
+ user-select: none;
78
+ }
79
+
80
+ .steps-header-center {
81
+ flex: 1;
82
+ display: flex;
83
+ align-items: center;
84
+ gap: 8px;
85
+ min-width: 0;
86
+ }
87
+
88
+ .steps-title {
89
+ font-size: 16px;
90
+ font-weight: 500;
91
+ color: var(--ai-text-primary, #333333);
92
+ white-space: nowrap;
93
+ overflow: hidden;
94
+ text-overflow: ellipsis;
95
+ }
96
+
97
+ .progress-badge {
98
+ font-size: 12px;
99
+ font-weight: 500;
100
+ color: var(--ai-accent-dark);
101
+ background: var(--ai-accent-bg);
102
+ padding: 2px 8px;
103
+ border-radius: 9999px;
104
+ white-space: nowrap;
105
+ flex-shrink: 0;
106
+ }
107
+
108
+ /* ── Collapse button ────────────────────────────────────── */
109
+ .collapse-btn {
110
+ display: inline-flex;
111
+ align-items: center;
112
+ justify-content: center;
113
+ background: none;
114
+ border: none;
115
+ padding: 0;
116
+ cursor: pointer;
117
+ color: var(--ai-text-secondary, #737373);
118
+ flex-shrink: 0;
119
+ transition: transform 0.2s ease;
120
+ transform: rotate(180deg);
121
+ }
122
+
123
+ .collapse-btn.expanded {
124
+ transform: rotate(0deg);
125
+ }
126
+
127
+ /* ── Steps body ─────────────────────────────────────────── */
128
+ .steps-body {
129
+ padding: 12px 16px;
130
+ display: flex;
131
+ flex-direction: column;
132
+ }
133
+
134
+ .step-row {
135
+ display: flex;
136
+ align-items: flex-start;
137
+ gap: 12px;
138
+ cursor: pointer;
139
+ padding: 4px 0;
140
+ }
141
+
142
+ .step-row:hover .step-text {
143
+ color: var(--ai-text-primary, #333333);
144
+ }
145
+
146
+ .step-text {
147
+ flex: 1;
148
+ font-size: 14px;
149
+ font-weight: 400;
150
+ color: var(--ai-text-secondary, #737373);
151
+ line-height: 1.5;
152
+ padding-top: 4px;
153
+ }
154
+
155
+ /* ── Step badge column (badge + separator) ──────────────── */
156
+ .step-badge-col {
157
+ display: flex;
158
+ flex-direction: column;
159
+ align-items: center;
160
+ flex-shrink: 0;
161
+ }
162
+
163
+ .step-separator {
164
+ width: 1px;
165
+ height: 16px;
166
+ background: var(--ai-border-default, #eeeeee);
167
+ margin: 2px 0;
168
+ }
169
+
170
+ /* ── Step badge ─────────────────────────────────────────── */
171
+ .step-badge-outer {
172
+ padding: 2px;
173
+ border-radius: 9999px;
174
+ background: var(--ai-bg-surface, #f4f4f4);
175
+ display: inline-flex;
176
+ align-items: center;
177
+ justify-content: center;
178
+ }
179
+
180
+ .step-badge-inner {
181
+ width: 26px;
182
+ height: 26px;
183
+ border-radius: 9999px;
184
+ background: var(--ai-bg-card, #ffffff);
185
+ box-shadow: 0px 0px 2px 1px rgba(18, 18, 23, 0.08);
186
+ display: flex;
187
+ align-items: center;
188
+ justify-content: center;
189
+ color: var(--ai-text-secondary, #737373);
190
+ }
191
+
192
+ .step-badge-inner.completed {
193
+ background: var(--ai-success-bg);
194
+ color: var(--ai-success-text);
195
+ }
196
+
197
+ .step-number {
198
+ font-size: 14px;
199
+ font-weight: 500;
200
+ color: var(--ai-text-secondary, #737373);
201
+ line-height: 1;
202
+ }