@placeholderco/placeholder-ui 1.0.11 → 2.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 (289) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +134 -130
  3. package/dist/app.css +178 -0
  4. package/dist/bootstrap.min.css +3600 -0
  5. package/dist/cards/GitCard.svelte +115 -0
  6. package/dist/cards/GitCard.svelte.d.ts +22 -0
  7. package/dist/display/Avatar.svelte +29 -17
  8. package/dist/display/Avatar.svelte.d.ts +12 -2
  9. package/dist/display/LinkCollection.svelte +40 -18
  10. package/dist/display/LinkCollection.svelte.d.ts +9 -2
  11. package/dist/display/Paper.svelte +31 -19
  12. package/dist/display/Paper.svelte.d.ts +12 -3
  13. package/dist/display/alert/Alert.svelte +129 -0
  14. package/dist/display/alert/Alert.svelte.d.ts +15 -0
  15. package/dist/display/alert/AlertVariant.d.ts +1 -0
  16. package/dist/display/alert/AlertVariant.js +1 -0
  17. package/dist/display/filetree/FileTree.svelte +259 -0
  18. package/dist/display/filetree/FileTree.svelte.d.ts +76 -0
  19. package/dist/display/filetree/FileTreeItem.svelte +396 -0
  20. package/dist/display/filetree/FileTreeItem.svelte.d.ts +40 -0
  21. package/dist/display/filetree/FileTreeNode.d.ts +46 -0
  22. package/dist/display/filetree/FileTreeNode.js +115 -0
  23. package/dist/display/filetree/index.d.ts +5 -0
  24. package/dist/display/filetree/index.js +3 -0
  25. package/dist/editors/CodeMirror.svelte +306 -0
  26. package/dist/editors/CodeMirror.svelte.d.ts +31 -0
  27. package/dist/editors/tiptap/LinkActionMenu.svelte +307 -0
  28. package/dist/editors/tiptap/LinkActionMenu.svelte.d.ts +8 -0
  29. package/dist/editors/tiptap/TipTap.svelte +856 -0
  30. package/dist/editors/tiptap/TipTap.svelte.d.ts +54 -0
  31. package/dist/editors/tiptap/TipTapBubble.svelte +790 -0
  32. package/dist/editors/tiptap/TipTapBubble.svelte.d.ts +44 -0
  33. package/dist/editors/tiptap/collaboration.d.ts +55 -0
  34. package/dist/editors/tiptap/collaboration.js +1 -0
  35. package/dist/editors/tiptap/extensions/Alert.d.ts +18 -0
  36. package/dist/editors/tiptap/extensions/Alert.js +72 -0
  37. package/dist/editors/tiptap/extensions/CodeBlockEditor.d.ts +21 -0
  38. package/dist/editors/tiptap/extensions/CodeBlockEditor.js +326 -0
  39. package/dist/editors/tiptap/extensions/Div.d.ts +19 -0
  40. package/dist/editors/tiptap/extensions/Div.js +89 -0
  41. package/dist/editors/tiptap/extensions/Span.d.ts +5 -0
  42. package/dist/editors/tiptap/extensions/Span.js +56 -0
  43. package/dist/editors/tiptap/extensions/codeBlockEditor.css +236 -0
  44. package/dist/editors/tiptap/extensions/codeBlockLanguages.d.ts +17 -0
  45. package/dist/editors/tiptap/extensions/codeBlockLanguages.js +124 -0
  46. package/dist/editors/tiptap/extensions/index.d.ts +7 -0
  47. package/dist/editors/tiptap/extensions/index.js +5 -0
  48. package/dist/editors/tiptap/toolbar/AlertButton.svelte +261 -0
  49. package/dist/editors/tiptap/toolbar/AlertButton.svelte.d.ts +7 -0
  50. package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte +18 -0
  51. package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte.d.ts +7 -0
  52. package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte +18 -0
  53. package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte.d.ts +7 -0
  54. package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte +18 -0
  55. package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte.d.ts +7 -0
  56. package/dist/editors/tiptap/toolbar/AlignRightButton.svelte +18 -0
  57. package/dist/editors/tiptap/toolbar/AlignRightButton.svelte.d.ts +7 -0
  58. package/dist/editors/tiptap/toolbar/BoldButton.svelte +18 -0
  59. package/dist/editors/tiptap/toolbar/BoldButton.svelte.d.ts +7 -0
  60. package/dist/editors/tiptap/toolbar/BulletListButton.svelte +18 -0
  61. package/dist/editors/tiptap/toolbar/BulletListButton.svelte.d.ts +7 -0
  62. package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte +18 -0
  63. package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte.d.ts +7 -0
  64. package/dist/editors/tiptap/toolbar/CodeButton.svelte +18 -0
  65. package/dist/editors/tiptap/toolbar/CodeButton.svelte.d.ts +7 -0
  66. package/dist/editors/tiptap/toolbar/ColorButton.svelte +299 -0
  67. package/dist/editors/tiptap/toolbar/ColorButton.svelte.d.ts +20 -0
  68. package/dist/editors/tiptap/toolbar/DocumentButton.svelte +58 -0
  69. package/dist/editors/tiptap/toolbar/DocumentButton.svelte.d.ts +9 -0
  70. package/dist/editors/tiptap/toolbar/HeadingButton.svelte +30 -0
  71. package/dist/editors/tiptap/toolbar/HeadingButton.svelte.d.ts +8 -0
  72. package/dist/editors/tiptap/toolbar/HtmlButton.svelte +68 -0
  73. package/dist/editors/tiptap/toolbar/HtmlButton.svelte.d.ts +7 -0
  74. package/dist/editors/tiptap/toolbar/ImageButton.svelte +54 -0
  75. package/dist/editors/tiptap/toolbar/ImageButton.svelte.d.ts +8 -0
  76. package/dist/editors/tiptap/toolbar/ItalicButton.svelte +18 -0
  77. package/dist/editors/tiptap/toolbar/ItalicButton.svelte.d.ts +7 -0
  78. package/dist/editors/tiptap/toolbar/LinkButton.svelte +257 -0
  79. package/dist/editors/tiptap/toolbar/LinkButton.svelte.d.ts +7 -0
  80. package/dist/editors/tiptap/toolbar/OrderedListButton.svelte +18 -0
  81. package/dist/editors/tiptap/toolbar/OrderedListButton.svelte.d.ts +7 -0
  82. package/dist/editors/tiptap/toolbar/RedoButton.svelte +18 -0
  83. package/dist/editors/tiptap/toolbar/RedoButton.svelte.d.ts +7 -0
  84. package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte +18 -0
  85. package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte.d.ts +7 -0
  86. package/dist/editors/tiptap/toolbar/SubscriptButton.svelte +18 -0
  87. package/dist/editors/tiptap/toolbar/SubscriptButton.svelte.d.ts +7 -0
  88. package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte +18 -0
  89. package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte.d.ts +7 -0
  90. package/dist/editors/tiptap/toolbar/TableButton.svelte +258 -0
  91. package/dist/editors/tiptap/toolbar/TableButton.svelte.d.ts +7 -0
  92. package/dist/editors/tiptap/toolbar/ToolbarButton.svelte +84 -0
  93. package/dist/editors/tiptap/toolbar/ToolbarButton.svelte.d.ts +10 -0
  94. package/dist/editors/tiptap/toolbar/UnderlineButton.svelte +18 -0
  95. package/dist/editors/tiptap/toolbar/UnderlineButton.svelte.d.ts +7 -0
  96. package/dist/editors/tiptap/toolbar/UndoButton.svelte +18 -0
  97. package/dist/editors/tiptap/toolbar/UndoButton.svelte.d.ts +7 -0
  98. package/dist/form/Autocomplete.svelte +270 -137
  99. package/dist/form/Autocomplete.svelte.d.ts +58 -10
  100. package/dist/form/AutocompleteMulti.svelte +385 -227
  101. package/dist/form/AutocompleteMulti.svelte.d.ts +59 -10
  102. package/dist/form/Checkbox.svelte +124 -43
  103. package/dist/form/Checkbox.svelte.d.ts +26 -2
  104. package/dist/form/Chips.svelte +47 -17
  105. package/dist/form/Chips.svelte.d.ts +24 -3
  106. package/dist/form/ComboBox.svelte +30 -20
  107. package/dist/form/ComboBox.svelte.d.ts +1 -1
  108. package/dist/form/ComboBoxItemBuilder.svelte +161 -188
  109. package/dist/form/ComboBoxItemBuilder.svelte.d.ts +19 -2
  110. package/dist/form/ComboBoxMulti.svelte +38 -24
  111. package/dist/form/ComboBoxMulti.svelte.d.ts +1 -1
  112. package/dist/form/CronBuilder.svelte +84 -67
  113. package/dist/form/CronBuilder.svelte.d.ts +16 -3
  114. package/dist/form/DatePicker.svelte +177 -191
  115. package/dist/form/DatePicker.svelte.d.ts +17 -2
  116. package/dist/form/DateRangePicker.svelte +775 -0
  117. package/dist/form/DateRangePicker.svelte.d.ts +23 -0
  118. package/dist/form/DateTimePicker.svelte +168 -209
  119. package/dist/form/DateTimePicker.svelte.d.ts +10 -2
  120. package/dist/form/FormGroup.svelte +33 -10
  121. package/dist/form/FormGroup.svelte.d.ts +12 -2
  122. package/dist/form/Number.svelte +71 -29
  123. package/dist/form/Number.svelte.d.ts +39 -6
  124. package/dist/form/Radio.svelte +174 -0
  125. package/dist/form/Radio.svelte.d.ts +21 -0
  126. package/dist/form/RadioGroup.svelte +52 -138
  127. package/dist/form/RadioGroup.svelte.d.ts +19 -2
  128. package/dist/form/SegmentedControl.svelte +103 -57
  129. package/dist/form/SegmentedControl.svelte.d.ts +12 -2
  130. package/dist/form/Select.svelte +160 -229
  131. package/dist/form/Select.svelte.d.ts +35 -6
  132. package/dist/form/SelectMulti.svelte +166 -277
  133. package/dist/form/SelectMulti.svelte.d.ts +37 -6
  134. package/dist/form/Slider.svelte +185 -268
  135. package/dist/form/Slider.svelte.d.ts +33 -16
  136. package/dist/form/StringArrayBuilder.svelte +249 -0
  137. package/dist/form/StringArrayBuilder.svelte.d.ts +15 -0
  138. package/dist/form/Switch.svelte +164 -106
  139. package/dist/form/Switch.svelte.d.ts +22 -3
  140. package/dist/form/TextArea.svelte +80 -45
  141. package/dist/form/TextArea.svelte.d.ts +35 -10
  142. package/dist/form/Textbox.svelte +80 -47
  143. package/dist/form/Textbox.svelte.d.ts +41 -8
  144. package/dist/form/TimePicker.svelte +42 -47
  145. package/dist/form/TimePicker.svelte.d.ts +12 -2
  146. package/dist/form/comboBoxCore.svelte.d.ts +99 -0
  147. package/dist/form/comboBoxCore.svelte.js +243 -0
  148. package/dist/icon/Icon.svelte +8 -3
  149. package/dist/icon/Icon.svelte.d.ts +8 -3
  150. package/dist/icon/cube-send.svg +1 -0
  151. package/dist/icon/file-type-bmp.svg +1 -0
  152. package/dist/icon/file-type-csv.svg +1 -0
  153. package/dist/icon/file-type-doc.svg +1 -0
  154. package/dist/icon/file-type-docx.svg +1 -0
  155. package/dist/icon/file-type-jpg.svg +1 -0
  156. package/dist/icon/file-type-pdf.svg +1 -0
  157. package/dist/icon/file-type-png.svg +1 -0
  158. package/dist/icon/file-type-ppt.svg +1 -0
  159. package/dist/icon/file-type-svg.svg +1 -0
  160. package/dist/icon/file-type-txt.svg +1 -0
  161. package/dist/icon/file-type-xls.svg +1 -0
  162. package/dist/icon/file-type-zip.svg +1 -0
  163. package/dist/icon/index.d.ts +166 -145
  164. package/dist/icon/index.js +166 -146
  165. package/dist/icon/layout-sidebar-left-collapse.svg +1 -0
  166. package/dist/icon/layout-sidebar-left-expand.svg +1 -0
  167. package/dist/icon/logo-placeholder.svg +6 -0
  168. package/dist/icon/paperclip.svg +1 -0
  169. package/dist/icon/source-code.svg +1 -0
  170. package/dist/icon/sun-moon.svg +1 -0
  171. package/dist/icon/table.svg +6 -0
  172. package/dist/icon/thumb-down.svg +1 -0
  173. package/dist/icon/thumb-up.svg +1 -0
  174. package/dist/index.d.ts +93 -22
  175. package/dist/index.js +28 -27
  176. package/dist/layout/AppShell.svelte +12 -162
  177. package/dist/layout/AppShell.svelte.d.ts +6 -27
  178. package/dist/layout/CustomNavbar.svelte +9 -7
  179. package/dist/layout/CustomNavbar.svelte.d.ts +4 -2
  180. package/dist/layout/Navbar.svelte +158 -110
  181. package/dist/layout/Navbar.svelte.d.ts +26 -12
  182. package/dist/layout/NavbarItemDisplay.svelte +2 -2
  183. package/dist/layout/NavbarItemView.svelte +182 -0
  184. package/dist/layout/NavbarItemView.svelte.d.ts +10 -0
  185. package/dist/layout/Sidenav.svelte +280 -341
  186. package/dist/layout/Sidenav.svelte.d.ts +36 -4
  187. package/dist/models/ComboBoxItem.d.ts +2 -0
  188. package/dist/models/Employee.d.ts +53 -0
  189. package/dist/models/Employee.js +23 -0
  190. package/dist/models/Hyperlink.d.ts +3 -1
  191. package/dist/models/LinkCollectionItem.d.ts +3 -1
  192. package/dist/models/NavbarItem.d.ts +6 -2
  193. package/dist/theme.svelte.d.ts +0 -1
  194. package/dist/theme.svelte.js +46 -58
  195. package/dist/ui/Accordion.svelte +81 -242
  196. package/dist/ui/Accordion.svelte.d.ts +37 -14
  197. package/dist/ui/AccordionItem.svelte +303 -0
  198. package/dist/ui/AccordionItem.svelte.d.ts +21 -0
  199. package/dist/ui/ActionIcon.svelte +25 -21
  200. package/dist/ui/ActionIcon.svelte.d.ts +15 -2
  201. package/dist/ui/Badge.svelte +170 -161
  202. package/dist/ui/Badge.svelte.d.ts +16 -4
  203. package/dist/ui/Button.svelte +178 -205
  204. package/dist/ui/Button.svelte.d.ts +19 -2
  205. package/dist/ui/ButtonVariant.d.ts +15 -1
  206. package/dist/ui/ContextMenu.svelte +146 -0
  207. package/dist/ui/ContextMenu.svelte.d.ts +37 -0
  208. package/dist/ui/ContextMenuList.svelte +188 -0
  209. package/dist/ui/ContextMenuList.svelte.d.ts +12 -0
  210. package/dist/ui/Dialog.svelte +183 -104
  211. package/dist/ui/Dialog.svelte.d.ts +21 -2
  212. package/dist/ui/Drawer.svelte +237 -184
  213. package/dist/ui/Drawer.svelte.d.ts +20 -2
  214. package/dist/ui/Dropdown.svelte +24 -14
  215. package/dist/ui/Dropdown.svelte.d.ts +11 -2
  216. package/dist/ui/Dropzone.svelte +159 -57
  217. package/dist/ui/Dropzone.svelte.d.ts +29 -2
  218. package/dist/ui/Link.svelte +12 -4
  219. package/dist/ui/Link.svelte.d.ts +8 -2
  220. package/dist/ui/Loader.svelte +23 -18
  221. package/dist/ui/Loader.svelte.d.ts +5 -2
  222. package/dist/ui/Logo.svelte +37 -0
  223. package/dist/ui/Logo.svelte.d.ts +16 -0
  224. package/dist/ui/MultiSortable.svelte +287 -0
  225. package/dist/ui/MultiSortable.svelte.d.ts +50 -0
  226. package/dist/ui/Pagination.svelte +12 -6
  227. package/dist/ui/Pagination.svelte.d.ts +6 -2
  228. package/dist/ui/Popover.svelte +43 -65
  229. package/dist/ui/Popover.svelte.d.ts +14 -5
  230. package/dist/ui/ProgressBar.svelte +169 -0
  231. package/dist/ui/ProgressBar.svelte.d.ts +30 -0
  232. package/dist/ui/ProgressBarVariant.d.ts +7 -0
  233. package/dist/ui/ProgressBarVariant.js +1 -0
  234. package/dist/ui/SegmentedControl.svelte +0 -0
  235. package/dist/ui/SegmentedControl.svelte.d.ts +26 -0
  236. package/dist/ui/Sortable.svelte +163 -0
  237. package/dist/ui/Sortable.svelte.d.ts +47 -0
  238. package/dist/ui/Table.svelte +497 -56
  239. package/dist/ui/Table.svelte.d.ts +64 -2
  240. package/dist/ui/Tabs.svelte +22 -18
  241. package/dist/ui/Tabs.svelte.d.ts +6 -2
  242. package/dist/ui/ThemeSwitcher.svelte +26 -7
  243. package/dist/ui/ThemeSwitcher.svelte.d.ts +4 -2
  244. package/dist/ui/Tooltip.svelte +312 -180
  245. package/dist/ui/Tooltip.svelte.d.ts +4 -3
  246. package/dist/uiTheme.svelte.d.ts +86 -0
  247. package/dist/uiTheme.svelte.js +214 -0
  248. package/dist/util/DateFunctions.js +1 -1
  249. package/dist/util/DragDrop.d.ts +50 -0
  250. package/dist/util/DragDrop.js +154 -0
  251. package/dist/util/NavigateTo.js +2 -2
  252. package/dist/util/dayjs.d.ts +4 -0
  253. package/dist/util/dayjs.js +15 -0
  254. package/dist/util/interceptLinkClick.d.ts +13 -0
  255. package/dist/util/interceptLinkClick.js +33 -0
  256. package/package.json +66 -26
  257. package/dist/display/Alert.svelte +0 -179
  258. package/dist/display/Alert.svelte.d.ts +0 -13
  259. package/dist/form/FileInput.svelte +0 -235
  260. package/dist/form/FileInput.svelte.d.ts +0 -23
  261. package/dist/form/PasswordInput.svelte +0 -252
  262. package/dist/form/PasswordInput.svelte.d.ts +0 -33
  263. package/dist/form/Rating.svelte +0 -235
  264. package/dist/form/Rating.svelte.d.ts +0 -21
  265. package/dist/styles/components.css +0 -199
  266. package/dist/styles/dark.css +0 -146
  267. package/dist/styles/index.css +0 -116
  268. package/dist/styles/reset.css +0 -110
  269. package/dist/styles/semantic.css +0 -86
  270. package/dist/styles/tokens.css +0 -203
  271. package/dist/styles/utilities.css +0 -523
  272. package/dist/ui/Breadcrumbs.svelte +0 -131
  273. package/dist/ui/Breadcrumbs.svelte.d.ts +0 -16
  274. package/dist/ui/LoadingOverlay.svelte +0 -53
  275. package/dist/ui/LoadingOverlay.svelte.d.ts +0 -11
  276. package/dist/ui/Progress.svelte +0 -191
  277. package/dist/ui/Progress.svelte.d.ts +0 -15
  278. package/dist/ui/RingProgress.svelte +0 -141
  279. package/dist/ui/RingProgress.svelte.d.ts +0 -18
  280. package/dist/ui/Skeleton.svelte +0 -85
  281. package/dist/ui/Skeleton.svelte.d.ts +0 -12
  282. package/dist/ui/Stepper.svelte +0 -355
  283. package/dist/ui/Stepper.svelte.d.ts +0 -24
  284. package/dist/ui/Timeline.svelte +0 -225
  285. package/dist/ui/Timeline.svelte.d.ts +0 -23
  286. /package/dist/{actions → util}/ClickOutside.d.ts +0 -0
  287. /package/dist/{actions → util}/ClickOutside.js +0 -0
  288. /package/dist/{transitions → util}/Transitions.d.ts +0 -0
  289. /package/dist/{transitions → util}/Transitions.js +0 -0
@@ -1,43 +1,72 @@
1
1
  <script lang="ts">
2
2
  import FormGroup from './FormGroup.svelte';
3
-
4
- interface Props {
3
+
4
+ const autoName = `textarea-${crypto.randomUUID()}`;
5
+
6
+ export interface TextAreaProps {
7
+ /** HTML name attribute for the textarea (falls back to label, then auto-generated) */
8
+ name?: string;
9
+ /** Label text displayed above the textarea */
5
10
  label?: string;
11
+ /** Custom ID for the textarea element */
6
12
  inputId?: string;
13
+ /** Placeholder text when textarea is empty */
7
14
  placeholder?: string;
15
+ /** Mark field as required (shows asterisk) */
8
16
  required?: boolean;
17
+ /** Auto-focus the textarea on mount */
9
18
  autofocus?: boolean;
10
- noAutocomplete?: boolean;
19
+ /** HTML autocomplete attribute for the input */
20
+ autocomplete?: string;
21
+ /** CSS classes for the FormGroup wrapper */
11
22
  groupClass?: string;
23
+ /** Reference to the textarea DOM element */
12
24
  textboxElement?: HTMLElement;
25
+ /** CSS classes for the textarea element */
13
26
  class?: string;
27
+ /** CSS classes for the container element */
14
28
  containerClass?: string;
29
+ /** Disable the textarea */
15
30
  disabled?: boolean;
31
+ /** Textarea value (bindable) */
16
32
  value?: string;
33
+ /** Height of the textarea (e.g., '200px', '10rem') */
34
+ height?: string;
35
+ /** Position of the tooltip */
17
36
  tooltipLocation?: 'top' | 'bottom' | 'left' | 'right';
37
+ /** Tooltip text on hover */
18
38
  tooltipText?: string;
19
- onblur?: (e: FocusEvent) => void;
20
- onfocus?: (e: FocusEvent) => void;
21
- onchange?: (e: FocusEvent) => void;
22
- oninput?: (e: FocusEvent) => void;
23
- onkeydown?: (e: FocusEvent) => void;
24
- onkeypress?: (e: FocusEvent) => void;
25
- onkeyup?: (e: FocusEvent) => void;
39
+ /** Callback when textarea loses focus */
40
+ onblur?: (value: string, e: FocusEvent) => void;
41
+ /** Callback when textarea gains focus */
42
+ onfocus?: (value: string, e: FocusEvent) => void;
43
+ /** Callback when value changes */
44
+ onchange?: (e: Event) => void;
45
+ /** Callback on input event */
46
+ oninput?: (e: Event) => void;
47
+ /** Callback on keydown event */
48
+ onkeydown?: (e: KeyboardEvent) => void;
49
+ /** Callback on keypress event */
50
+ onkeypress?: (e: KeyboardEvent) => void;
51
+ /** Callback on keyup event */
52
+ onkeyup?: (e: KeyboardEvent) => void;
26
53
  }
27
54
 
28
55
  let {
56
+ name,
29
57
  label = '',
30
58
  inputId = undefined,
31
59
  placeholder = undefined,
32
60
  required = false,
33
61
  autofocus = false,
34
- noAutocomplete = false,
62
+ autocomplete = undefined,
35
63
  class: classes = '',
36
64
  containerClass = '',
37
65
  groupClass = '',
38
66
  textboxElement: textboxElement = undefined,
39
67
  disabled = false,
40
68
  value = $bindable(''),
69
+ height = undefined,
41
70
  tooltipLocation = 'top',
42
71
  tooltipText = undefined,
43
72
  onblur = undefined,
@@ -46,8 +75,12 @@
46
75
  oninput = undefined,
47
76
  onkeydown = undefined,
48
77
  onkeypress = undefined,
49
- onkeyup = undefined,
50
- }: Props = $props();
78
+ onkeyup = undefined
79
+ }: TextAreaProps = $props();
80
+
81
+ let resolvedName = $derived(
82
+ (name || label || autoName).replace(/[^a-zA-Z0-9_\-:.]/g, '_')
83
+ );
51
84
 
52
85
  let showRequiredRing = $state(false);
53
86
  const id = $derived(inputId ?? `input-${label.replaceAll(' ', '')}`);
@@ -61,20 +94,22 @@
61
94
  {showRequiredRing && '!border-required'}
62
95
  {classes}"
63
96
  {id}
97
+ name={resolvedName}
64
98
  {placeholder}
65
99
  {disabled}
66
100
  {autofocus}
67
101
  {required}
68
- autocomplete={!noAutocomplete ? 'on' : 'off'}
102
+ autocomplete={autocomplete as any}
103
+ style={height ? `height: ${height}` : undefined}
69
104
  bind:value
70
105
  bind:this={textboxElement}
71
- {onblur}
72
- {onfocus}
73
- onchange={() => onchange?.(new FocusEvent('change'))}
74
- oninput={() => oninput?.(new FocusEvent('input'))}
75
- onkeydown={() => onkeydown?.(new FocusEvent('keydown'))}
76
- onkeypress={() => onkeypress?.(new FocusEvent('keypress'))}
77
- onkeyup={() => onkeyup?.(new FocusEvent('keyup'))}
106
+ onblur={(e) => onblur?.(value, e)}
107
+ onfocus={(e) => onfocus?.(value, e)}
108
+ {onchange}
109
+ {oninput}
110
+ {onkeydown}
111
+ {onkeypress}
112
+ {onkeyup}
78
113
  ></textarea>
79
114
  </FormGroup>
80
115
  </div>
@@ -84,65 +119,65 @@
84
119
  display: block;
85
120
  width: 100%;
86
121
  min-height: calc(2.25rem + 2px);
87
- padding: var(--pui-spacing-2);
88
- font-size: var(--pui-font-size-md);
89
- font-weight: var(--pui-font-weight-normal);
90
- line-height: var(--pui-line-height-normal);
91
- color: var(--pui-input-text);
92
- background-color: var(--pui-input-bg);
122
+ padding: 0.5rem;
123
+ font-size: 1rem;
124
+ font-weight: 400;
125
+ line-height: 1.5;
126
+ color: var(--text-base);
127
+ background-color: var(--input-bg-color);
93
128
  background-image: none;
94
- border: 1px solid var(--pui-input-border);
95
- border-radius: var(--pui-radius-md);
129
+ border: 1px solid var(--border-color);
130
+ border-radius: 0.375rem;
96
131
  appearance: none;
97
- transition: border-color var(--pui-transition-fast) var(--pui-ease-in-out);
132
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
98
133
  resize: vertical;
99
134
 
100
135
  &::placeholder {
101
- color: var(--pui-text-placeholder);
136
+ color: #6c757d;
102
137
  opacity: 1;
103
138
  }
104
139
 
105
140
  &:focus {
106
- border-color: var(--pui-color-primary);
141
+ border-color: var(--ui-primary);
107
142
  outline: 0;
108
143
  box-shadow: none;
109
144
  }
110
145
 
111
146
  &:disabled {
112
- background-color: var(--pui-bg-disabled);
113
- opacity: 1;
147
+ background-color: var(--border-color);
148
+ opacity: 0.5;
114
149
  cursor: not-allowed;
115
150
  }
116
151
  }
117
152
 
118
153
  :global(.dark) textarea {
119
- background-color: var(--pui-input-bg);
120
- color: var(--pui-input-text);
121
- border-color: var(--pui-input-border);
154
+ background-color: var(--input-bg-color);
155
+ color: var(--text-base);
156
+ border-color: var(--border-color);
122
157
 
123
158
  &::placeholder {
124
- color: var(--pui-text-placeholder);
159
+ color: #9ca3af;
125
160
  }
126
161
 
127
162
  &:focus {
128
- border-color: var(--pui-color-secondary);
163
+ border-color: var(--ui-accent);
129
164
  }
130
165
 
131
166
  &:disabled {
132
- background-color: var(--pui-bg-disabled);
133
- color: var(--pui-input-text);
167
+ background-color: var(--border-color);
168
+ opacity: 0.5;
134
169
  }
135
170
  }
136
171
 
137
172
  /* Fix for resize handle in dark mode */
138
173
  :global(.dark) textarea::-webkit-resizer {
139
- background-color: var(--pui-color-gray-700);
140
- border-color: var(--pui-border-default);
174
+ background-color: #2f353b;
175
+ border-color: var(--border-color);
141
176
  }
142
177
 
143
178
  .loader {
144
179
  position: absolute;
145
- right: var(--pui-spacing-2);
146
- top: var(--pui-spacing-2);
180
+ right: 8px;
181
+ top: 8px;
147
182
  }
148
183
  </style>
@@ -1,26 +1,51 @@
1
- interface Props {
1
+ export interface TextAreaProps {
2
+ /** HTML name attribute for the textarea (falls back to label, then auto-generated) */
3
+ name?: string;
4
+ /** Label text displayed above the textarea */
2
5
  label?: string;
6
+ /** Custom ID for the textarea element */
3
7
  inputId?: string;
8
+ /** Placeholder text when textarea is empty */
4
9
  placeholder?: string;
10
+ /** Mark field as required (shows asterisk) */
5
11
  required?: boolean;
12
+ /** Auto-focus the textarea on mount */
6
13
  autofocus?: boolean;
7
- noAutocomplete?: boolean;
14
+ /** HTML autocomplete attribute for the input */
15
+ autocomplete?: string;
16
+ /** CSS classes for the FormGroup wrapper */
8
17
  groupClass?: string;
18
+ /** Reference to the textarea DOM element */
9
19
  textboxElement?: HTMLElement;
20
+ /** CSS classes for the textarea element */
10
21
  class?: string;
22
+ /** CSS classes for the container element */
11
23
  containerClass?: string;
24
+ /** Disable the textarea */
12
25
  disabled?: boolean;
26
+ /** Textarea value (bindable) */
13
27
  value?: string;
28
+ /** Height of the textarea (e.g., '200px', '10rem') */
29
+ height?: string;
30
+ /** Position of the tooltip */
14
31
  tooltipLocation?: 'top' | 'bottom' | 'left' | 'right';
32
+ /** Tooltip text on hover */
15
33
  tooltipText?: string;
16
- onblur?: (e: FocusEvent) => void;
17
- onfocus?: (e: FocusEvent) => void;
18
- onchange?: (e: FocusEvent) => void;
19
- oninput?: (e: FocusEvent) => void;
20
- onkeydown?: (e: FocusEvent) => void;
21
- onkeypress?: (e: FocusEvent) => void;
22
- onkeyup?: (e: FocusEvent) => void;
34
+ /** Callback when textarea loses focus */
35
+ onblur?: (value: string, e: FocusEvent) => void;
36
+ /** Callback when textarea gains focus */
37
+ onfocus?: (value: string, e: FocusEvent) => void;
38
+ /** Callback when value changes */
39
+ onchange?: (e: Event) => void;
40
+ /** Callback on input event */
41
+ oninput?: (e: Event) => void;
42
+ /** Callback on keydown event */
43
+ onkeydown?: (e: KeyboardEvent) => void;
44
+ /** Callback on keypress event */
45
+ onkeypress?: (e: KeyboardEvent) => void;
46
+ /** Callback on keyup event */
47
+ onkeyup?: (e: KeyboardEvent) => void;
23
48
  }
24
- declare const TextArea: import("svelte").Component<Props, {}, "value">;
49
+ declare const TextArea: import("svelte").Component<TextAreaProps, {}, "value">;
25
50
  type TextArea = ReturnType<typeof TextArea>;
26
51
  export default TextArea;
@@ -4,48 +4,83 @@
4
4
  import Loader from '../ui/Loader.svelte';
5
5
  import Icon from '../icon/Icon.svelte';
6
6
 
7
- interface Props {
7
+ const autoName = `textbox-${crypto.randomUUID()}`;
8
+
9
+ export interface TextboxProps {
10
+ /** HTML name attribute for the input (falls back to label, then auto-generated) */
11
+ name?: string;
12
+ /** Label text displayed above the input */
8
13
  label?: string;
14
+ /** Custom ID for the input element */
9
15
  inputId?: string;
16
+ /** Placeholder text when input is empty */
10
17
  placeholder?: string;
18
+ /** Mark field as required (shows asterisk) */
11
19
  required?: boolean;
20
+ /** Auto-focus the input on mount */
12
21
  autofocus?: boolean;
13
- noAutocomplete?: boolean;
14
- preventPasswordSave?: boolean;
22
+ /** HTML autocomplete attribute for the input */
23
+ autocomplete?: string;
24
+ /** Show loading spinner inside the input */
15
25
  loading?: boolean;
26
+ /** CSS classes for the FormGroup wrapper */
16
27
  groupClass?: string;
28
+ /** Reference to the input DOM element (bindable) */
17
29
  textboxElement?: HTMLElement;
30
+ /** SVG icon displayed on the left side */
18
31
  leftIconSvg?: string;
32
+ /** CSS classes for the input element */
19
33
  class?: string;
34
+ /** CSS classes for the container element */
20
35
  containerClass?: string;
36
+ /** Disable the input */
21
37
  disabled?: boolean;
38
+ /** Input value (bindable) */
22
39
  value?: string;
40
+ /** Whether the input is currently focused */
23
41
  isFocused?: boolean;
42
+ /** Show error state styling */
24
43
  showError?: boolean;
44
+ /** Error message to display */
25
45
  errorText?: string;
46
+ /** Position of the tooltip */
26
47
  tooltipLocation?: 'top' | 'bottom' | 'left' | 'right';
48
+ /** Rich tooltip content using a Svelte snippet */
49
+ tooltipContent?: Snippet;
50
+ /** Tooltip text on hover */
27
51
  tooltipText?: string;
28
- onenter?: (v: string) => void;
52
+ /** Callback when Enter key is pressed */
53
+ onenter?: (value: string) => void;
54
+ /** Callback when value changes */
29
55
  onchange?: (e: Event) => void;
56
+ /** Callback on input event */
30
57
  oninput?: (e: Event) => void;
58
+ /** Callback on keydown event */
31
59
  onkeydown?: (e: KeyboardEvent) => void;
60
+ /** Callback on keypress event */
32
61
  onkeypress?: (e: KeyboardEvent) => void;
62
+ /** Callback on keyup event */
33
63
  onkeyup?: (e: KeyboardEvent) => void;
34
- onfocus?: (e: FocusEvent) => void;
35
- onblur?: (e: FocusEvent) => void;
64
+ /** Callback when input gains focus */
65
+ onfocus?: (value: string, e: FocusEvent) => void;
66
+ /** Callback when input loses focus */
67
+ onblur?: (value: string, e: FocusEvent) => void;
68
+ /** Content to render on the right side of the input */
36
69
  right?: Snippet;
70
+ /** Additional content below the input */
37
71
  children?: Snippet;
38
- type?: 'text' | 'password';
72
+ /** Input type */
73
+ type?: 'text' | 'password' | 'email' | 'number' | 'search' | 'tel' | 'url';
39
74
  }
40
75
 
41
76
  let {
77
+ name,
42
78
  label = '',
43
79
  inputId = undefined,
44
80
  placeholder = undefined,
45
81
  required = false,
46
82
  autofocus = false,
47
- noAutocomplete = false,
48
- preventPasswordSave = false,
83
+ autocomplete = undefined,
49
84
  loading = false,
50
85
  class: classes = '',
51
86
  containerClass = '',
@@ -58,6 +93,7 @@
58
93
  showError = false,
59
94
  errorText = '',
60
95
  tooltipLocation = 'top',
96
+ tooltipContent = undefined,
61
97
  tooltipText = undefined,
62
98
  onenter = undefined,
63
99
  onchange = undefined,
@@ -70,22 +106,18 @@
70
106
  right,
71
107
  children,
72
108
  type = 'text'
73
- }: Props = $props();
74
-
75
- // Generate ID on client-side only to avoid hydration mismatches
76
- let autoId = $state('');
109
+ }: TextboxProps = $props();
77
110
 
78
- $effect(() => {
79
- if (!inputId && !label) {
80
- autoId = Math.random().toString(36).substring(2, 8);
81
- }
82
- });
111
+ let resolvedName = $derived(
112
+ (name || label || autoName).replace(/[^a-zA-Z0-9_\-:.]/g, '_')
113
+ );
83
114
 
84
115
  let id = $derived.by(() => {
85
116
  if (inputId) return inputId;
86
117
  // convert label to lowercase, replace spaces with hyphens
87
118
  if (label) return `input-${label.toLowerCase().replace(/ /g, '-')}`;
88
- return autoId;
119
+ // generate 6 character random string
120
+ return Math.random().toString(36).substring(2, 8);
89
121
  });
90
122
 
91
123
  const extraClasses: string[] = $derived.by(() => {
@@ -97,36 +129,31 @@
97
129
 
98
130
  return classes;
99
131
  });
100
-
101
- const autocompleteValue = $derived.by(() => {
102
- if (noAutocomplete) return 'off';
103
- if (type === 'password' && preventPasswordSave) return 'one-time-code';
104
- return 'on';
105
- });
106
132
  </script>
107
133
 
108
134
  <div class="textbox-container {containerClass}">
109
- <FormGroup {label} {required} {id} class={groupClass} {tooltipLocation} {tooltipText}>
135
+ <FormGroup {label} {required} {id} class={groupClass} {tooltipLocation} {tooltipContent} {tooltipText}>
110
136
  <div class="textbox-input">
111
137
  <!-- svelte-ignore a11y_autofocus -->
112
138
  <input
113
139
  class="textbox {classes} {extraClasses.join(' ')}"
114
140
  {type}
115
141
  {id}
142
+ name={resolvedName}
116
143
  {placeholder}
117
144
  {disabled}
118
145
  {autofocus}
119
146
  {required}
120
- autocomplete={autocompleteValue}
147
+ autocomplete={autocomplete as any}
121
148
  bind:value
122
149
  bind:this={textboxElement}
123
- onblur={() => {
150
+ onblur={(e) => {
124
151
  isFocused = false;
125
- onblur?.(new FocusEvent('blur'));
152
+ onblur?.(value, e);
126
153
  }}
127
- onfocus={() => {
154
+ onfocus={(e) => {
128
155
  isFocused = true;
129
- onfocus?.(new FocusEvent('focus'));
156
+ onfocus?.(value, e);
130
157
  }}
131
158
  {onchange}
132
159
  {oninput}
@@ -174,29 +201,30 @@
174
201
 
175
202
  .textbox {
176
203
  width: 100%;
177
- font-size: var(--pui-font-size-md);
178
- line-height: var(--pui-line-height-normal);
179
- padding: var(--pui-spacing-1) var(--pui-spacing-2);
180
- border: 1px solid var(--pui-input-border);
181
- background-color: var(--pui-input-bg);
182
- color: var(--pui-input-text);
183
- border-radius: var(--pui-radius-base);
204
+ font-size: 1rem;
205
+ line-height: 1.5rem;
206
+ padding: 0.25rem;
207
+ border: 1px solid var(--border-color);
208
+ background-color: var(--input-bg-color);
209
+ color: var(--text-color);
210
+ border-radius: 0.25rem;
211
+ padding: 0.25rem 0.5rem;
184
212
  box-sizing: border-box;
185
213
  }
186
214
 
187
215
  .textbox.disabled {
188
216
  opacity: 0.5;
189
217
  cursor: not-allowed;
190
- background: var(--pui-input-bg-disabled);
218
+ background: var(--border-color);
191
219
  }
192
220
 
193
221
  .textbox:focus {
194
- border-color: var(--pui-input-border-focus);
222
+ border-color: var(--accent-color);
195
223
  outline: 2px solid transparent;
196
- outline-offset: var(--pui-focus-ring-offset);
224
+ outline-offset: 2px;
197
225
 
198
226
  & ~ .left-icon {
199
- color: var(--pui-input-border-focus);
227
+ color: var(--accent-color);
200
228
  }
201
229
  }
202
230
 
@@ -206,23 +234,28 @@
206
234
  }
207
235
 
208
236
  .with-left-icon {
209
- padding-left: var(--pui-spacing-8);
237
+ padding-left: 2rem;
210
238
  }
211
239
 
212
240
  .left-icon {
241
+ /* absolute {isFocused ? 'text-accent' : 'text-neutral-500'}
242
+ pointer-events-none
243
+ top-1/2 -translate-y-1/2
244
+ left-4 -translate-x-1/2 */
245
+
213
246
  position: absolute;
214
247
  pointer-events: none;
215
248
  top: 50%;
216
249
  transform: translateY(-40%);
217
- left: var(--pui-spacing-2);
218
- color: var(--pui-text-muted);
250
+ left: 0.5rem;
251
+ color: rgb(115 115 115);
219
252
  }
220
253
 
221
254
  .show-error {
222
- border-color: var(--pui-text-danger);
255
+ border-color: var(--danger-text);
223
256
  }
224
257
 
225
258
  .text-error {
226
- color: var(--pui-text-danger);
259
+ color: var(--danger-text);
227
260
  }
228
261
  </style>
@@ -1,37 +1,70 @@
1
1
  import { type Snippet } from 'svelte';
2
- interface Props {
2
+ export interface TextboxProps {
3
+ /** HTML name attribute for the input (falls back to label, then auto-generated) */
4
+ name?: string;
5
+ /** Label text displayed above the input */
3
6
  label?: string;
7
+ /** Custom ID for the input element */
4
8
  inputId?: string;
9
+ /** Placeholder text when input is empty */
5
10
  placeholder?: string;
11
+ /** Mark field as required (shows asterisk) */
6
12
  required?: boolean;
13
+ /** Auto-focus the input on mount */
7
14
  autofocus?: boolean;
8
- noAutocomplete?: boolean;
9
- preventPasswordSave?: boolean;
15
+ /** HTML autocomplete attribute for the input */
16
+ autocomplete?: string;
17
+ /** Show loading spinner inside the input */
10
18
  loading?: boolean;
19
+ /** CSS classes for the FormGroup wrapper */
11
20
  groupClass?: string;
21
+ /** Reference to the input DOM element (bindable) */
12
22
  textboxElement?: HTMLElement;
23
+ /** SVG icon displayed on the left side */
13
24
  leftIconSvg?: string;
25
+ /** CSS classes for the input element */
14
26
  class?: string;
27
+ /** CSS classes for the container element */
15
28
  containerClass?: string;
29
+ /** Disable the input */
16
30
  disabled?: boolean;
31
+ /** Input value (bindable) */
17
32
  value?: string;
33
+ /** Whether the input is currently focused */
18
34
  isFocused?: boolean;
35
+ /** Show error state styling */
19
36
  showError?: boolean;
37
+ /** Error message to display */
20
38
  errorText?: string;
39
+ /** Position of the tooltip */
21
40
  tooltipLocation?: 'top' | 'bottom' | 'left' | 'right';
41
+ /** Rich tooltip content using a Svelte snippet */
42
+ tooltipContent?: Snippet;
43
+ /** Tooltip text on hover */
22
44
  tooltipText?: string;
23
- onenter?: (v: string) => void;
45
+ /** Callback when Enter key is pressed */
46
+ onenter?: (value: string) => void;
47
+ /** Callback when value changes */
24
48
  onchange?: (e: Event) => void;
49
+ /** Callback on input event */
25
50
  oninput?: (e: Event) => void;
51
+ /** Callback on keydown event */
26
52
  onkeydown?: (e: KeyboardEvent) => void;
53
+ /** Callback on keypress event */
27
54
  onkeypress?: (e: KeyboardEvent) => void;
55
+ /** Callback on keyup event */
28
56
  onkeyup?: (e: KeyboardEvent) => void;
29
- onfocus?: (e: FocusEvent) => void;
30
- onblur?: (e: FocusEvent) => void;
57
+ /** Callback when input gains focus */
58
+ onfocus?: (value: string, e: FocusEvent) => void;
59
+ /** Callback when input loses focus */
60
+ onblur?: (value: string, e: FocusEvent) => void;
61
+ /** Content to render on the right side of the input */
31
62
  right?: Snippet;
63
+ /** Additional content below the input */
32
64
  children?: Snippet;
33
- type?: 'text' | 'password';
65
+ /** Input type */
66
+ type?: 'text' | 'password' | 'email' | 'number' | 'search' | 'tel' | 'url';
34
67
  }
35
- declare const Textbox: import("svelte").Component<Props, {}, "value" | "textboxElement">;
68
+ declare const Textbox: import("svelte").Component<TextboxProps, {}, "value" | "textboxElement">;
36
69
  type Textbox = ReturnType<typeof Textbox>;
37
70
  export default Textbox;