@promakeai/inspector 1.0.0 → 1.0.3

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 (204) hide show
  1. package/README.md +111 -0
  2. package/dist/App.d.ts.map +1 -0
  3. package/dist/__tests__/App.test.d.ts.map +1 -0
  4. package/dist/components/Badge.d.ts.map +1 -0
  5. package/dist/components/ControlBox/ContentArea.d.ts.map +1 -0
  6. package/dist/components/ControlBox/PromptInput.d.ts.map +1 -0
  7. package/dist/components/ControlBox/index.d.ts.map +1 -0
  8. package/dist/components/ImageEditor/UploadBox.d.ts.map +1 -0
  9. package/dist/components/ImageEditor/index.d.ts.map +1 -0
  10. package/dist/components/Overlay.d.ts.map +1 -0
  11. package/dist/components/StyleEditor/BorderSection.d.ts.map +1 -0
  12. package/dist/components/StyleEditor/ColorPicker.d.ts.map +1 -0
  13. package/dist/components/StyleEditor/DisplaySection.d.ts.map +1 -0
  14. package/dist/components/StyleEditor/ImageSection.d.ts.map +1 -0
  15. package/dist/components/StyleEditor/LayoutSection.d.ts.map +1 -0
  16. package/dist/components/StyleEditor/NumberInput.d.ts.map +1 -0
  17. package/dist/components/StyleEditor/SliderInput.d.ts.map +1 -0
  18. package/dist/components/StyleEditor/SpacingSection.d.ts.map +1 -0
  19. package/dist/components/StyleEditor/TextSection.d.ts.map +1 -0
  20. package/dist/components/StyleEditor/index.d.ts.map +1 -0
  21. package/dist/components/TextEditor/index.d.ts.map +1 -0
  22. package/dist/components/ui/CustomCollapsible.d.ts.map +1 -0
  23. package/dist/components/ui/button.d.ts.map +1 -0
  24. package/dist/components/ui/color-picker.d.ts.map +1 -0
  25. package/dist/components/ui/input.d.ts.map +1 -0
  26. package/dist/components/ui/popover.d.ts.map +1 -0
  27. package/dist/components/ui/select.d.ts.map +1 -0
  28. package/dist/components/ui/slider.d.ts.map +1 -0
  29. package/dist/components/ui/textarea.d.ts.map +1 -0
  30. package/dist/components/ui/tooltip.d.ts.map +1 -0
  31. package/dist/core/highlighter.d.ts.map +1 -0
  32. package/dist/hooks/useMessageBridge.d.ts.map +1 -0
  33. package/dist/hooks/useStylePreview.d.ts.map +1 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/lib/utils.d.ts.map +1 -0
  36. package/dist/plugin.d.ts.map +1 -0
  37. package/dist/store/useInspectorStore.d.ts.map +1 -0
  38. package/dist/styles.d.ts.map +1 -0
  39. package/dist/utils/colorUtils.d.ts.map +1 -0
  40. package/dist/utils/elementNames.d.ts.map +1 -0
  41. package/dist/utils/elementUtils.d.ts.map +1 -0
  42. package/dist/utils/errorTracker.d.ts.map +1 -0
  43. package/dist/utils/inputStyles.d.ts.map +1 -0
  44. package/dist/utils/styleUtils.d.ts.map +1 -0
  45. package/dist/utils/tailwindMapper.d.ts.map +1 -0
  46. package/dist/utils/urlTracker.d.ts.map +1 -0
  47. package/package.json +15 -10
  48. package/dist/packages/inspector/src/App.d.ts.map +0 -1
  49. package/dist/packages/inspector/src/__tests__/App.test.d.ts.map +0 -1
  50. package/dist/packages/inspector/src/components/Badge.d.ts.map +0 -1
  51. package/dist/packages/inspector/src/components/ControlBox/ContentArea.d.ts.map +0 -1
  52. package/dist/packages/inspector/src/components/ControlBox/PromptInput.d.ts.map +0 -1
  53. package/dist/packages/inspector/src/components/ControlBox/index.d.ts.map +0 -1
  54. package/dist/packages/inspector/src/components/ImageEditor/UploadBox.d.ts.map +0 -1
  55. package/dist/packages/inspector/src/components/ImageEditor/index.d.ts.map +0 -1
  56. package/dist/packages/inspector/src/components/Overlay.d.ts.map +0 -1
  57. package/dist/packages/inspector/src/components/StyleEditor/BorderSection.d.ts.map +0 -1
  58. package/dist/packages/inspector/src/components/StyleEditor/ColorPicker.d.ts.map +0 -1
  59. package/dist/packages/inspector/src/components/StyleEditor/DisplaySection.d.ts.map +0 -1
  60. package/dist/packages/inspector/src/components/StyleEditor/ImageSection.d.ts.map +0 -1
  61. package/dist/packages/inspector/src/components/StyleEditor/LayoutSection.d.ts.map +0 -1
  62. package/dist/packages/inspector/src/components/StyleEditor/NumberInput.d.ts.map +0 -1
  63. package/dist/packages/inspector/src/components/StyleEditor/SliderInput.d.ts.map +0 -1
  64. package/dist/packages/inspector/src/components/StyleEditor/SpacingSection.d.ts.map +0 -1
  65. package/dist/packages/inspector/src/components/StyleEditor/TextSection.d.ts.map +0 -1
  66. package/dist/packages/inspector/src/components/StyleEditor/index.d.ts.map +0 -1
  67. package/dist/packages/inspector/src/components/TextEditor/index.d.ts.map +0 -1
  68. package/dist/packages/inspector/src/components/ui/CustomCollapsible.d.ts.map +0 -1
  69. package/dist/packages/inspector/src/components/ui/button.d.ts.map +0 -1
  70. package/dist/packages/inspector/src/components/ui/color-picker.d.ts.map +0 -1
  71. package/dist/packages/inspector/src/components/ui/input.d.ts.map +0 -1
  72. package/dist/packages/inspector/src/components/ui/popover.d.ts.map +0 -1
  73. package/dist/packages/inspector/src/components/ui/select.d.ts.map +0 -1
  74. package/dist/packages/inspector/src/components/ui/slider.d.ts.map +0 -1
  75. package/dist/packages/inspector/src/components/ui/textarea.d.ts.map +0 -1
  76. package/dist/packages/inspector/src/components/ui/tooltip.d.ts.map +0 -1
  77. package/dist/packages/inspector/src/core/highlighter.d.ts.map +0 -1
  78. package/dist/packages/inspector/src/hooks/useMessageBridge.d.ts.map +0 -1
  79. package/dist/packages/inspector/src/hooks/useStylePreview.d.ts.map +0 -1
  80. package/dist/packages/inspector/src/index.d.ts.map +0 -1
  81. package/dist/packages/inspector/src/lib/utils.d.ts.map +0 -1
  82. package/dist/packages/inspector/src/plugin.d.ts.map +0 -1
  83. package/dist/packages/inspector/src/store/useInspectorStore.d.ts.map +0 -1
  84. package/dist/packages/inspector/src/styles.d.ts.map +0 -1
  85. package/dist/packages/inspector/src/utils/colorUtils.d.ts.map +0 -1
  86. package/dist/packages/inspector/src/utils/elementNames.d.ts.map +0 -1
  87. package/dist/packages/inspector/src/utils/elementUtils.d.ts.map +0 -1
  88. package/dist/packages/inspector/src/utils/errorTracker.d.ts.map +0 -1
  89. package/dist/packages/inspector/src/utils/inputStyles.d.ts.map +0 -1
  90. package/dist/packages/inspector/src/utils/styleUtils.d.ts.map +0 -1
  91. package/dist/packages/inspector/src/utils/tailwindMapper.d.ts.map +0 -1
  92. package/dist/packages/inspector/src/utils/urlTracker.d.ts.map +0 -1
  93. package/dist/packages/inspector/tsconfig.tsbuildinfo +0 -1
  94. package/src/App.tsx +0 -912
  95. package/src/__tests__/App.test.tsx +0 -373
  96. package/src/assets/fonts/Satoshi-Variable.woff +0 -0
  97. package/src/assets/fonts/Satoshi-Variable.woff2 +0 -0
  98. package/src/components/Badge.tsx +0 -118
  99. package/src/components/ControlBox/ContentArea.tsx +0 -13
  100. package/src/components/ControlBox/PromptInput.module.css +0 -66
  101. package/src/components/ControlBox/PromptInput.tsx +0 -104
  102. package/src/components/ControlBox/index.module.css +0 -81
  103. package/src/components/ControlBox/index.tsx +0 -409
  104. package/src/components/ImageEditor/UploadBox.module.css +0 -69
  105. package/src/components/ImageEditor/UploadBox.tsx +0 -113
  106. package/src/components/ImageEditor/index.module.css +0 -11
  107. package/src/components/ImageEditor/index.tsx +0 -84
  108. package/src/components/Overlay.tsx +0 -157
  109. package/src/components/StyleEditor/BorderSection.tsx +0 -147
  110. package/src/components/StyleEditor/ColorPicker.tsx +0 -182
  111. package/src/components/StyleEditor/DisplaySection.tsx +0 -349
  112. package/src/components/StyleEditor/ImageSection.tsx +0 -105
  113. package/src/components/StyleEditor/LayoutSection.tsx +0 -63
  114. package/src/components/StyleEditor/NumberInput.tsx +0 -138
  115. package/src/components/StyleEditor/SliderInput.tsx +0 -121
  116. package/src/components/StyleEditor/SpacingSection.tsx +0 -365
  117. package/src/components/StyleEditor/TextSection.tsx +0 -381
  118. package/src/components/StyleEditor/index.module.css +0 -133
  119. package/src/components/StyleEditor/index.tsx +0 -612
  120. package/src/components/StyleEditor/shared.module.css +0 -193
  121. package/src/components/TextEditor/index.module.css +0 -31
  122. package/src/components/TextEditor/index.tsx +0 -166
  123. package/src/components/ui/CustomCollapsible.tsx +0 -159
  124. package/src/components/ui/button.module.css +0 -141
  125. package/src/components/ui/button.tsx +0 -73
  126. package/src/components/ui/color-picker.module.css +0 -112
  127. package/src/components/ui/color-picker.tsx +0 -146
  128. package/src/components/ui/input.module.css +0 -49
  129. package/src/components/ui/input.tsx +0 -34
  130. package/src/components/ui/popover.module.css +0 -42
  131. package/src/components/ui/popover.tsx +0 -59
  132. package/src/components/ui/select.module.css +0 -160
  133. package/src/components/ui/select.tsx +0 -216
  134. package/src/components/ui/slider.module.css +0 -75
  135. package/src/components/ui/slider.tsx +0 -60
  136. package/src/components/ui/textarea.module.css +0 -30
  137. package/src/components/ui/textarea.tsx +0 -23
  138. package/src/components/ui/tooltip.module.css +0 -11
  139. package/src/components/ui/tooltip.tsx +0 -37
  140. package/src/core/highlighter.ts +0 -197
  141. package/src/hooks/useMessageBridge.ts +0 -49
  142. package/src/hooks/useStylePreview.ts +0 -332
  143. package/src/index.ts +0 -20
  144. package/src/lib/utils.ts +0 -5
  145. package/src/plugin.ts +0 -11
  146. package/src/store/useInspectorStore.ts +0 -235
  147. package/src/styles/fonts.css +0 -15
  148. package/src/styles/global.css +0 -138
  149. package/src/styles/variables.css +0 -151
  150. package/src/styles.ts +0 -5
  151. package/src/utils/colorUtils.ts +0 -133
  152. package/src/utils/elementNames.ts +0 -103
  153. package/src/utils/elementUtils.ts +0 -90
  154. package/src/utils/errorTracker.ts +0 -186
  155. package/src/utils/inputStyles.ts +0 -30
  156. package/src/utils/styleUtils.ts +0 -226
  157. package/src/utils/tailwindMapper.ts +0 -554
  158. package/src/utils/urlTracker.ts +0 -75
  159. package/src/vite-env.d.ts +0 -7
  160. /package/dist/{packages/inspector/src/App.d.ts → App.d.ts} +0 -0
  161. /package/dist/{packages/inspector/src/__tests__ → __tests__}/App.test.d.ts +0 -0
  162. /package/dist/{packages/inspector/src/components → components}/Badge.d.ts +0 -0
  163. /package/dist/{packages/inspector/src/components → components}/ControlBox/ContentArea.d.ts +0 -0
  164. /package/dist/{packages/inspector/src/components → components}/ControlBox/PromptInput.d.ts +0 -0
  165. /package/dist/{packages/inspector/src/components → components}/ControlBox/index.d.ts +0 -0
  166. /package/dist/{packages/inspector/src/components → components}/ImageEditor/UploadBox.d.ts +0 -0
  167. /package/dist/{packages/inspector/src/components → components}/ImageEditor/index.d.ts +0 -0
  168. /package/dist/{packages/inspector/src/components → components}/Overlay.d.ts +0 -0
  169. /package/dist/{packages/inspector/src/components → components}/StyleEditor/BorderSection.d.ts +0 -0
  170. /package/dist/{packages/inspector/src/components → components}/StyleEditor/ColorPicker.d.ts +0 -0
  171. /package/dist/{packages/inspector/src/components → components}/StyleEditor/DisplaySection.d.ts +0 -0
  172. /package/dist/{packages/inspector/src/components → components}/StyleEditor/ImageSection.d.ts +0 -0
  173. /package/dist/{packages/inspector/src/components → components}/StyleEditor/LayoutSection.d.ts +0 -0
  174. /package/dist/{packages/inspector/src/components → components}/StyleEditor/NumberInput.d.ts +0 -0
  175. /package/dist/{packages/inspector/src/components → components}/StyleEditor/SliderInput.d.ts +0 -0
  176. /package/dist/{packages/inspector/src/components → components}/StyleEditor/SpacingSection.d.ts +0 -0
  177. /package/dist/{packages/inspector/src/components → components}/StyleEditor/TextSection.d.ts +0 -0
  178. /package/dist/{packages/inspector/src/components → components}/StyleEditor/index.d.ts +0 -0
  179. /package/dist/{packages/inspector/src/components → components}/TextEditor/index.d.ts +0 -0
  180. /package/dist/{packages/inspector/src/components → components}/ui/CustomCollapsible.d.ts +0 -0
  181. /package/dist/{packages/inspector/src/components → components}/ui/button.d.ts +0 -0
  182. /package/dist/{packages/inspector/src/components → components}/ui/color-picker.d.ts +0 -0
  183. /package/dist/{packages/inspector/src/components → components}/ui/input.d.ts +0 -0
  184. /package/dist/{packages/inspector/src/components → components}/ui/popover.d.ts +0 -0
  185. /package/dist/{packages/inspector/src/components → components}/ui/select.d.ts +0 -0
  186. /package/dist/{packages/inspector/src/components → components}/ui/slider.d.ts +0 -0
  187. /package/dist/{packages/inspector/src/components → components}/ui/textarea.d.ts +0 -0
  188. /package/dist/{packages/inspector/src/components → components}/ui/tooltip.d.ts +0 -0
  189. /package/dist/{packages/inspector/src/core → core}/highlighter.d.ts +0 -0
  190. /package/dist/{packages/inspector/src/hooks → hooks}/useMessageBridge.d.ts +0 -0
  191. /package/dist/{packages/inspector/src/hooks → hooks}/useStylePreview.d.ts +0 -0
  192. /package/dist/{packages/inspector/src/index.d.ts → index.d.ts} +0 -0
  193. /package/dist/{packages/inspector/src/lib → lib}/utils.d.ts +0 -0
  194. /package/dist/{packages/inspector/src/plugin.d.ts → plugin.d.ts} +0 -0
  195. /package/dist/{packages/inspector/src/store → store}/useInspectorStore.d.ts +0 -0
  196. /package/dist/{packages/inspector/src/styles.d.ts → styles.d.ts} +0 -0
  197. /package/dist/{packages/inspector/src/utils → utils}/colorUtils.d.ts +0 -0
  198. /package/dist/{packages/inspector/src/utils → utils}/elementNames.d.ts +0 -0
  199. /package/dist/{packages/inspector/src/utils → utils}/elementUtils.d.ts +0 -0
  200. /package/dist/{packages/inspector/src/utils → utils}/errorTracker.d.ts +0 -0
  201. /package/dist/{packages/inspector/src/utils → utils}/inputStyles.d.ts +0 -0
  202. /package/dist/{packages/inspector/src/utils → utils}/styleUtils.d.ts +0 -0
  203. /package/dist/{packages/inspector/src/utils → utils}/tailwindMapper.d.ts +0 -0
  204. /package/dist/{packages/inspector/src/utils → utils}/urlTracker.d.ts +0 -0
@@ -1,193 +0,0 @@
1
- /* Shared styles for all style editor sections */
2
-
3
- .section {
4
- display: flex;
5
- flex-direction: column;
6
- gap: var(--spacing-2);
7
- margin-bottom: var(--spacing-1);
8
- }
9
-
10
- .sectionTitle {
11
- font-family: "Satoshi", var(--font-family-sans);
12
- font-size: var(--text-xs);
13
- font-weight: var(--font-semibold);
14
- margin-bottom: var(--spacing-2);
15
- }
16
-
17
- .grid2 {
18
- display: grid;
19
- grid-template-columns: repeat(2, minmax(0, 1fr));
20
- gap: var(--spacing-2);
21
- width: 100%;
22
- box-sizing: border-box;
23
- }
24
-
25
- .grid4 {
26
- display: grid;
27
- grid-template-columns: repeat(4, minmax(0, 1fr));
28
- gap: var(--spacing-1);
29
- width: 100%;
30
- }
31
-
32
- .flexRow {
33
- display: flex;
34
- align-items: center;
35
- gap: var(--spacing-1);
36
- }
37
-
38
- .flexRowGap2 {
39
- display: flex;
40
- align-items: center;
41
- gap: var(--spacing-2);
42
- }
43
-
44
- .inputField {
45
- margin-bottom: var(--spacing-2);
46
- }
47
-
48
- .labelContainer {
49
- display: flex;
50
- align-items: center;
51
- gap: var(--spacing-1);
52
- margin-bottom: var(--spacing-1);
53
- }
54
-
55
- .label {
56
- display: block;
57
- font-family: "Satoshi", var(--font-family-sans);
58
- font-size: var(--text-xs);
59
- font-weight: 500;
60
- letter-spacing: -0.01em;
61
- -webkit-font-smoothing: antialiased;
62
- -moz-osx-font-smoothing: grayscale;
63
- }
64
-
65
- .resetIcon {
66
- background: none;
67
- border: none;
68
- padding: 2px;
69
- cursor: pointer;
70
- display: flex;
71
- align-items: center;
72
- opacity: 0.7;
73
- transition: opacity var(--transition-fast);
74
- }
75
-
76
- .resetIcon:hover {
77
- opacity: 1;
78
- }
79
-
80
- .inputContainer {
81
- display: flex;
82
- align-items: center;
83
- gap: var(--spacing-2);
84
- border-radius: var(--radius-md);
85
- padding: 4px;
86
- box-shadow: none;
87
- border: 1px solid;
88
- box-sizing: border-box;
89
- overflow: hidden;
90
- height: var(--spacing-9);
91
- transition: box-shadow var(--transition-fast);
92
- }
93
-
94
- .inputContainer:hover {
95
- box-shadow: none;
96
- }
97
-
98
- .buttonGroupContainer {
99
- padding-left: 0;
100
- padding-right: 0;
101
- }
102
-
103
- .input {
104
- font-family: "Satoshi", var(--font-family-sans);
105
- font-size: var(--text-xs);
106
- border: none;
107
- box-shadow: none;
108
- height: var(--spacing-8);
109
- padding: var(--spacing-1-5) var(--spacing-1-5);
110
- flex: 1;
111
- -webkit-font-smoothing: antialiased;
112
- -moz-osx-font-smoothing: grayscale;
113
- }
114
-
115
- .input:focus {
116
- outline: none;
117
- box-shadow: none;
118
- border-radius: var(--radius-sm);
119
- }
120
-
121
- .dragHandle {
122
- display: flex;
123
- align-items: center;
124
- justify-content: center;
125
- cursor: ew-resize;
126
- user-select: none;
127
- padding: var(--spacing-1);
128
- transition: var(--transition-fast);
129
- border-radius: var(--radius-sm);
130
- }
131
-
132
- .dragHandle:hover {
133
- opacity: 0.7;
134
- }
135
-
136
- .dragHandleIcon {
137
- width: var(--spacing-4);
138
- height: var(--spacing-4);
139
- }
140
-
141
- .colorPreview {
142
- width: var(--spacing-6);
143
- height: var(--spacing-6);
144
- border-radius: var(--radius-md);
145
- border: 2px solid;
146
- cursor: pointer;
147
- transition: all var(--transition-fast);
148
- flex-shrink: 0;
149
- box-shadow: none;
150
- }
151
-
152
- .colorPreview:hover {
153
- opacity: 0.95;
154
- box-shadow: none;
155
- }
156
-
157
- .fontButton {
158
- flex: 1;
159
- background-color: red;
160
- font-family: "Satoshi", var(--font-family-sans);
161
- font-size: var(--text-xs);
162
- font-weight: var(--font-medium);
163
- height: var(--spacing-9);
164
- border-radius: var(--radius-md);
165
- border: 1px solid transparent;
166
- transition: var(--transition-fast);
167
- }
168
-
169
- .fontButton:hover {
170
- opacity: 0.8;
171
- }
172
-
173
- .alignButton {
174
- height: var(--spacing-9);
175
- padding: var(--spacing-1-5) var(--spacing-2);
176
- border-radius: var(--radius-md);
177
- border: 1px solid transparent;
178
- transition: var(--transition-fast);
179
- flex: 1;
180
- display: flex;
181
- align-items: center;
182
- justify-content: center;
183
- }
184
-
185
- .alignButton:hover {
186
- opacity: 0.8;
187
- }
188
-
189
- .tabButtons {
190
- flex: 1;
191
- display: flex;
192
- width: 100%;
193
- }
@@ -1,31 +0,0 @@
1
- .container {
2
- display: flex;
3
- flex: 1;
4
- flex-direction: column;
5
- gap: var(--spacing-2);
6
- box-sizing: border-box;
7
- max-height: 40vh !important;
8
- padding: 0 var(--spacing-1);
9
- }
10
-
11
- .textarea {
12
- display: flex;
13
- flex-direction: column;
14
- font-family: "Satoshi", var(--font-family-sans);
15
- overflow-y: auto;
16
- resize: vertical;
17
- box-sizing: border-box;
18
- }
19
-
20
- .button {
21
- width: 100%;
22
- }
23
-
24
- .input {
25
- padding-left: var(--spacing-2);
26
- padding-right: var(--spacing-2);
27
- }
28
-
29
- .inputContainer {
30
- margin-top: var(--spacing-1);
31
- }
@@ -1,166 +0,0 @@
1
- /**
2
- * TextEditor component - Edit text content of elements
3
- */
4
-
5
- import { useState, useRef, useEffect } from "react";
6
- import { useMessageBridge } from "../../hooks/useMessageBridge";
7
- import { Textarea } from "../ui/textarea";
8
- import { Input } from "../ui/input";
9
- import { Button } from "../ui/button";
10
- import { useInspectorStore } from "../../store/useInspectorStore";
11
- import { isAnchor } from "../../utils/elementUtils";
12
- import type { SelectedElementData } from "@promakeai/inspector-types";
13
- import styles from "./index.module.css";
14
-
15
- interface TextEditorProps {
16
- element: HTMLElement;
17
- elementData: SelectedElementData;
18
- }
19
-
20
- export function TextEditor({ element, elementData }: TextEditorProps) {
21
- const { theme, labels } = useInspectorStore();
22
- const [text, setText] = useState("");
23
- const [href, setHref] = useState("");
24
- const textareaRef = useRef<HTMLTextAreaElement>(null);
25
- const { sendToParent } = useMessageBridge();
26
- const isAnchorElement = isAnchor(element);
27
-
28
- useEffect(() => {
29
- // Initialize with current text content
30
- if (elementData.isTextNode && elementData.textContent) {
31
- setText(elementData.textContent);
32
- }
33
-
34
- // Initialize href for anchor tags
35
- if (isAnchorElement) {
36
- const anchorElement = element as HTMLAnchorElement;
37
- setHref(anchorElement.href || "");
38
- }
39
-
40
- // Focus textarea
41
- if (textareaRef.current) {
42
- textareaRef.current.focus();
43
- textareaRef.current.select();
44
- }
45
- }, [elementData, element, isAnchorElement]);
46
-
47
- const handleUpdate = () => {
48
- // Update DOM immediately - only update direct text nodes, not nested ones
49
- const updateTextNodes = (el: HTMLElement) => {
50
- for (let i = 0; i < el.childNodes.length; i++) {
51
- const node = el.childNodes[i];
52
- if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim()) {
53
- node.textContent = text;
54
- break; // Only update the first text node, don't recurse
55
- }
56
- }
57
- };
58
-
59
- if (element) {
60
- updateTextNodes(element);
61
- }
62
-
63
- // Update href for anchor tags
64
- if (isAnchorElement && href) {
65
- const anchorElement = element as HTMLAnchorElement;
66
- anchorElement.href = href;
67
-
68
- // Send attribute update to parent
69
- sendToParent("INSPECTOR_ATTRIBUTE_UPDATED", {
70
- element: elementData,
71
- attribute: "href",
72
- value: href,
73
- originalValue: anchorElement.getAttribute("href") || "",
74
- });
75
- }
76
-
77
- // Send text update to parent
78
- sendToParent("INSPECTOR_TEXT_UPDATED", {
79
- text,
80
- originalText: elementData.textContent,
81
- element: elementData,
82
- });
83
- };
84
-
85
- const handleKeyPress = (e: KeyboardEvent) => {
86
- if (e.key === "Enter" && !e.shiftKey) {
87
- e.preventDefault();
88
- handleUpdate();
89
- }
90
- };
91
-
92
- return (
93
- <div className={styles.container}>
94
- {/* Text Content Label */}
95
- <div className={styles.inputContainer}>
96
- <label
97
- style={{
98
- display: "block",
99
- fontFamily: "Satoshi, sans-serif",
100
- fontSize: "var(--text-xs)",
101
- fontWeight: 500,
102
- marginBottom: "var(--spacing-1)",
103
- color: theme.textColor,
104
- }}
105
- >
106
- {labels.textContentLabel || "Text Content"}
107
- </label>
108
- <Textarea
109
- ref={textareaRef}
110
- value={text}
111
- onInput={(e) => setText((e.target as HTMLTextAreaElement).value)}
112
- onKeyDown={(e) => handleKeyPress(e as unknown as KeyboardEvent)}
113
- placeholder={labels.textPlaceholder}
114
- className={styles.textarea}
115
- style={{
116
- borderColor: theme.inputBorderColor,
117
- color: theme.inputTextColor,
118
- backgroundColor: theme.inputBackgroundColor,
119
- }}
120
- />
121
- </div>
122
- {/* Href input for anchor tags */}
123
- {isAnchorElement && (
124
- <div className={styles.inputContainer}>
125
- <label
126
- style={{
127
- display: "block",
128
- fontFamily: "Satoshi, sans-serif",
129
- fontSize: "var(--text-xs)",
130
- fontWeight: 500,
131
- marginBottom: "var(--spacing-1)",
132
- color: theme.textColor,
133
- }}
134
- >
135
- {labels.linkUrlLabel || "Link URL (href)"}
136
- </label>
137
- <Input
138
- type="url"
139
- value={href}
140
- onChange={(e) => setHref(e.target.value)}
141
- placeholder="https://example.com"
142
- className={styles.input}
143
- style={{
144
- borderColor: theme.inputBorderColor,
145
- color: theme.inputTextColor,
146
- backgroundColor: theme.inputBackgroundColor,
147
- }}
148
- />
149
- </div>
150
- )}
151
-
152
- <div>
153
- <Button
154
- onClick={handleUpdate}
155
- className={styles.button}
156
- style={{
157
- backgroundColor: theme.buttonColor,
158
- color: theme.buttonTextColor,
159
- }}
160
- >
161
- {labels.updateText}
162
- </Button>
163
- </div>
164
- </div>
165
- );
166
- }
@@ -1,159 +0,0 @@
1
- /**
2
- * Custom Collapsible Component
3
- * Simple accordion without external dependencies
4
- */
5
-
6
- import React, { useState, useRef, useEffect } from "react";
7
-
8
- interface CollapsibleProps {
9
- open?: boolean;
10
- onOpenChange?: (open: boolean) => void;
11
- children: React.ReactNode;
12
- }
13
-
14
- export function Collapsible({
15
- open = false,
16
- onOpenChange,
17
- children,
18
- }: CollapsibleProps) {
19
- const [isOpen, setIsOpen] = useState(open);
20
-
21
- useEffect(() => {
22
- setIsOpen(open);
23
- }, [open]);
24
-
25
- const handleToggle = () => {
26
- const newState = !isOpen;
27
- setIsOpen(newState);
28
- onOpenChange?.(newState);
29
- };
30
-
31
- return (
32
- <div data-collapsible data-state={isOpen ? "open" : "closed"}>
33
- {React.Children.map(children, (child) => {
34
- if (React.isValidElement(child)) {
35
- if (child.type === CollapsibleTrigger) {
36
- return React.cloneElement(child as React.ReactElement<any>, {
37
- onClick: handleToggle,
38
- "data-state": isOpen ? "open" : "closed",
39
- });
40
- }
41
- if (child.type === CollapsibleContent) {
42
- return React.cloneElement(child as React.ReactElement<any>, {
43
- isOpen,
44
- });
45
- }
46
- }
47
- return child;
48
- })}
49
- </div>
50
- );
51
- }
52
-
53
- interface CollapsibleTriggerProps {
54
- asChild?: boolean;
55
- children: React.ReactNode;
56
- onClick?: () => void;
57
- "data-state"?: "open" | "closed";
58
- }
59
-
60
- export const CollapsibleTrigger = React.forwardRef<HTMLButtonElement, CollapsibleTriggerProps>(
61
- ({ asChild, children, onClick, ...props }, ref) => {
62
- if (asChild && React.isValidElement(children)) {
63
- return React.cloneElement(children as React.ReactElement<any>, {
64
- onClick: (e: React.MouseEvent) => {
65
- onClick?.();
66
- (children as React.ReactElement<any>).props.onClick?.(e);
67
- },
68
- ...props,
69
- });
70
- }
71
-
72
- return (
73
- <button ref={ref} onClick={onClick} {...props}>
74
- {children}
75
- </button>
76
- );
77
- }
78
- );
79
-
80
- CollapsibleTrigger.displayName = "CollapsibleTrigger";
81
-
82
- interface CollapsibleContentProps {
83
- children: React.ReactNode;
84
- className?: string;
85
- isOpen?: boolean;
86
- }
87
-
88
- export function CollapsibleContent({
89
- children,
90
- className,
91
- isOpen,
92
- }: CollapsibleContentProps) {
93
- const contentRef = useRef<HTMLDivElement>(null);
94
- const innerRef = useRef<HTMLDivElement>(null);
95
- const [height, setHeight] = useState<string | number>(isOpen ? "auto" : 0);
96
- const [isAnimating, setIsAnimating] = useState(false);
97
-
98
- useEffect(() => {
99
- if (!contentRef.current || !innerRef.current) return;
100
-
101
- if (isOpen) {
102
- setIsAnimating(true);
103
- const contentHeight = innerRef.current.scrollHeight;
104
-
105
- // Start from 0
106
- setHeight(0);
107
-
108
- // Trigger reflow
109
- contentRef.current.offsetHeight;
110
-
111
- // Expand to full height
112
- setHeight(contentHeight);
113
-
114
- // After animation, set to auto for dynamic content
115
- const timer = setTimeout(() => {
116
- setHeight("auto");
117
- setIsAnimating(false);
118
- }, 200);
119
-
120
- return () => clearTimeout(timer);
121
- } else {
122
- setIsAnimating(true);
123
- // Get current height first for smooth collapse
124
- const contentHeight = innerRef.current.scrollHeight;
125
- setHeight(contentHeight);
126
-
127
- // Trigger reflow
128
- contentRef.current.offsetHeight;
129
-
130
- // Collapse to 0
131
- requestAnimationFrame(() => {
132
- setHeight(0);
133
- });
134
-
135
- // Clear animating flag
136
- const timer = setTimeout(() => {
137
- setIsAnimating(false);
138
- }, 200);
139
-
140
- return () => clearTimeout(timer);
141
- }
142
- }, [isOpen]);
143
-
144
- return (
145
- <div
146
- ref={contentRef}
147
- className={className}
148
- data-state={isOpen ? "open" : "closed"}
149
- style={{
150
- height: height,
151
- overflow: isOpen || isAnimating ? "hidden" : "hidden",
152
- transition: "height 200ms cubic-bezier(0.4, 0, 0.2, 1)",
153
- visibility: !isOpen && !isAnimating ? "hidden" : "visible",
154
- }}
155
- >
156
- <div ref={innerRef}>{children}</div>
157
- </div>
158
- );
159
- }
@@ -1,141 +0,0 @@
1
- /* Base button styles */
2
- .button {
3
- display: inline-flex;
4
- align-items: center;
5
- justify-content: center;
6
- gap: var(--spacing-2);
7
- white-space: nowrap;
8
- border-radius: var(--radius-md);
9
- font-family: 'Satoshi', var(--font-family-sans);
10
- font-size: var(--text-sm);
11
- font-weight: var(--font-medium);
12
- transition: all var(--transition-fast);
13
- cursor: pointer;
14
- outline: none;
15
- border: none;
16
- flex-shrink: 0;
17
- box-shadow: none;
18
- }
19
-
20
- .button:disabled {
21
- pointer-events: none;
22
- opacity: 0.5;
23
- }
24
-
25
- .button svg {
26
- width: 1rem;
27
- height: 1rem;
28
- flex-shrink: 0;
29
- pointer-events: none;
30
- }
31
-
32
- /* Variant styles using composition */
33
- .default {
34
- composes: button;
35
- box-shadow: none;
36
- }
37
-
38
- .default:hover:not(:disabled) {
39
- opacity: 0.95;
40
- box-shadow: none;
41
- }
42
-
43
- .destructive {
44
- composes: button;
45
- box-shadow: none;
46
- }
47
-
48
- .destructive:hover:not(:disabled) {
49
- opacity: 0.95;
50
- box-shadow: none;
51
- }
52
-
53
- .outline {
54
- composes: button;
55
- border: 1px solid;
56
- box-shadow: none;
57
- }
58
-
59
- .outline:hover:not(:disabled) {
60
- opacity: 0.9;
61
- box-shadow: none;
62
- }
63
-
64
- .secondary {
65
- composes: button;
66
- }
67
-
68
- .secondary:hover:not(:disabled) {
69
- opacity: 0.9;
70
- }
71
-
72
- .ghost {
73
- composes: button;
74
- background: transparent;
75
- }
76
-
77
- .ghost:hover:not(:disabled) {
78
- opacity: 0.7;
79
- }
80
-
81
- .link {
82
- composes: button;
83
- text-decoration: underline;
84
- text-underline-offset: 4px;
85
- }
86
-
87
- .link:hover:not(:disabled) {
88
- text-decoration: underline;
89
- opacity: 0.8;
90
- }
91
-
92
- /* Size variants */
93
- .sizeDefault {
94
- height: var(--spacing-9);
95
- padding: var(--spacing-2) var(--spacing-4);
96
- }
97
-
98
- .sizeDefault:has(> svg) {
99
- padding-left: var(--spacing-3);
100
- padding-right: var(--spacing-3);
101
- }
102
-
103
- .sizeSm {
104
- height: var(--spacing-8);
105
- padding: 0 var(--spacing-3);
106
- gap: var(--spacing-1-5);
107
- }
108
-
109
- .sizeSm:has(> svg) {
110
- padding-left: var(--spacing-2-5);
111
- padding-right: var(--spacing-2-5);
112
- }
113
-
114
- .sizeLg {
115
- height: var(--spacing-10);
116
- padding: 0 var(--spacing-6);
117
- }
118
-
119
- .sizeLg:has(> svg) {
120
- padding-left: var(--spacing-4);
121
- padding-right: var(--spacing-4);
122
- }
123
-
124
- .sizeIcon {
125
- width: var(--spacing-9);
126
- height: var(--spacing-9);
127
- padding: 0;
128
- }
129
-
130
- .sizeIconSm {
131
- width: var(--spacing-8);
132
- height: var(--spacing-8);
133
- padding: 0;
134
- }
135
-
136
- .sizeIconLg {
137
- width: var(--spacing-10);
138
- height: var(--spacing-10);
139
- padding: 0;
140
- }
141
-