@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.
- package/LICENSE +1 -1
- package/README.md +134 -130
- package/dist/app.css +178 -0
- package/dist/bootstrap.min.css +3600 -0
- package/dist/cards/GitCard.svelte +115 -0
- package/dist/cards/GitCard.svelte.d.ts +22 -0
- package/dist/display/Avatar.svelte +29 -17
- package/dist/display/Avatar.svelte.d.ts +12 -2
- package/dist/display/LinkCollection.svelte +40 -18
- package/dist/display/LinkCollection.svelte.d.ts +9 -2
- package/dist/display/Paper.svelte +31 -19
- package/dist/display/Paper.svelte.d.ts +12 -3
- package/dist/display/alert/Alert.svelte +129 -0
- package/dist/display/alert/Alert.svelte.d.ts +15 -0
- package/dist/display/alert/AlertVariant.d.ts +1 -0
- package/dist/display/alert/AlertVariant.js +1 -0
- package/dist/display/filetree/FileTree.svelte +259 -0
- package/dist/display/filetree/FileTree.svelte.d.ts +76 -0
- package/dist/display/filetree/FileTreeItem.svelte +396 -0
- package/dist/display/filetree/FileTreeItem.svelte.d.ts +40 -0
- package/dist/display/filetree/FileTreeNode.d.ts +46 -0
- package/dist/display/filetree/FileTreeNode.js +115 -0
- package/dist/display/filetree/index.d.ts +5 -0
- package/dist/display/filetree/index.js +3 -0
- package/dist/editors/CodeMirror.svelte +306 -0
- package/dist/editors/CodeMirror.svelte.d.ts +31 -0
- package/dist/editors/tiptap/LinkActionMenu.svelte +307 -0
- package/dist/editors/tiptap/LinkActionMenu.svelte.d.ts +8 -0
- package/dist/editors/tiptap/TipTap.svelte +856 -0
- package/dist/editors/tiptap/TipTap.svelte.d.ts +54 -0
- package/dist/editors/tiptap/TipTapBubble.svelte +790 -0
- package/dist/editors/tiptap/TipTapBubble.svelte.d.ts +44 -0
- package/dist/editors/tiptap/collaboration.d.ts +55 -0
- package/dist/editors/tiptap/collaboration.js +1 -0
- package/dist/editors/tiptap/extensions/Alert.d.ts +18 -0
- package/dist/editors/tiptap/extensions/Alert.js +72 -0
- package/dist/editors/tiptap/extensions/CodeBlockEditor.d.ts +21 -0
- package/dist/editors/tiptap/extensions/CodeBlockEditor.js +326 -0
- package/dist/editors/tiptap/extensions/Div.d.ts +19 -0
- package/dist/editors/tiptap/extensions/Div.js +89 -0
- package/dist/editors/tiptap/extensions/Span.d.ts +5 -0
- package/dist/editors/tiptap/extensions/Span.js +56 -0
- package/dist/editors/tiptap/extensions/codeBlockEditor.css +236 -0
- package/dist/editors/tiptap/extensions/codeBlockLanguages.d.ts +17 -0
- package/dist/editors/tiptap/extensions/codeBlockLanguages.js +124 -0
- package/dist/editors/tiptap/extensions/index.d.ts +7 -0
- package/dist/editors/tiptap/extensions/index.js +5 -0
- package/dist/editors/tiptap/toolbar/AlertButton.svelte +261 -0
- package/dist/editors/tiptap/toolbar/AlertButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignRightButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignRightButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/BoldButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/BoldButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/BulletListButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/BulletListButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/CodeButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/CodeButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/ColorButton.svelte +299 -0
- package/dist/editors/tiptap/toolbar/ColorButton.svelte.d.ts +20 -0
- package/dist/editors/tiptap/toolbar/DocumentButton.svelte +58 -0
- package/dist/editors/tiptap/toolbar/DocumentButton.svelte.d.ts +9 -0
- package/dist/editors/tiptap/toolbar/HeadingButton.svelte +30 -0
- package/dist/editors/tiptap/toolbar/HeadingButton.svelte.d.ts +8 -0
- package/dist/editors/tiptap/toolbar/HtmlButton.svelte +68 -0
- package/dist/editors/tiptap/toolbar/HtmlButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/ImageButton.svelte +54 -0
- package/dist/editors/tiptap/toolbar/ImageButton.svelte.d.ts +8 -0
- package/dist/editors/tiptap/toolbar/ItalicButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/ItalicButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/LinkButton.svelte +257 -0
- package/dist/editors/tiptap/toolbar/LinkButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/OrderedListButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/OrderedListButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/RedoButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/RedoButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/SubscriptButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/SubscriptButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/TableButton.svelte +258 -0
- package/dist/editors/tiptap/toolbar/TableButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/ToolbarButton.svelte +84 -0
- package/dist/editors/tiptap/toolbar/ToolbarButton.svelte.d.ts +10 -0
- package/dist/editors/tiptap/toolbar/UnderlineButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/UnderlineButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/UndoButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/UndoButton.svelte.d.ts +7 -0
- package/dist/form/Autocomplete.svelte +270 -137
- package/dist/form/Autocomplete.svelte.d.ts +58 -10
- package/dist/form/AutocompleteMulti.svelte +385 -227
- package/dist/form/AutocompleteMulti.svelte.d.ts +59 -10
- package/dist/form/Checkbox.svelte +124 -43
- package/dist/form/Checkbox.svelte.d.ts +26 -2
- package/dist/form/Chips.svelte +47 -17
- package/dist/form/Chips.svelte.d.ts +24 -3
- package/dist/form/ComboBox.svelte +30 -20
- package/dist/form/ComboBox.svelte.d.ts +1 -1
- package/dist/form/ComboBoxItemBuilder.svelte +161 -188
- package/dist/form/ComboBoxItemBuilder.svelte.d.ts +19 -2
- package/dist/form/ComboBoxMulti.svelte +38 -24
- package/dist/form/ComboBoxMulti.svelte.d.ts +1 -1
- package/dist/form/CronBuilder.svelte +84 -67
- package/dist/form/CronBuilder.svelte.d.ts +16 -3
- package/dist/form/DatePicker.svelte +177 -191
- package/dist/form/DatePicker.svelte.d.ts +17 -2
- package/dist/form/DateRangePicker.svelte +775 -0
- package/dist/form/DateRangePicker.svelte.d.ts +23 -0
- package/dist/form/DateTimePicker.svelte +168 -209
- package/dist/form/DateTimePicker.svelte.d.ts +10 -2
- package/dist/form/FormGroup.svelte +33 -10
- package/dist/form/FormGroup.svelte.d.ts +12 -2
- package/dist/form/Number.svelte +71 -29
- package/dist/form/Number.svelte.d.ts +39 -6
- package/dist/form/Radio.svelte +174 -0
- package/dist/form/Radio.svelte.d.ts +21 -0
- package/dist/form/RadioGroup.svelte +52 -138
- package/dist/form/RadioGroup.svelte.d.ts +19 -2
- package/dist/form/SegmentedControl.svelte +103 -57
- package/dist/form/SegmentedControl.svelte.d.ts +12 -2
- package/dist/form/Select.svelte +160 -229
- package/dist/form/Select.svelte.d.ts +35 -6
- package/dist/form/SelectMulti.svelte +166 -277
- package/dist/form/SelectMulti.svelte.d.ts +37 -6
- package/dist/form/Slider.svelte +185 -268
- package/dist/form/Slider.svelte.d.ts +33 -16
- package/dist/form/StringArrayBuilder.svelte +249 -0
- package/dist/form/StringArrayBuilder.svelte.d.ts +15 -0
- package/dist/form/Switch.svelte +164 -106
- package/dist/form/Switch.svelte.d.ts +22 -3
- package/dist/form/TextArea.svelte +80 -45
- package/dist/form/TextArea.svelte.d.ts +35 -10
- package/dist/form/Textbox.svelte +80 -47
- package/dist/form/Textbox.svelte.d.ts +41 -8
- package/dist/form/TimePicker.svelte +42 -47
- package/dist/form/TimePicker.svelte.d.ts +12 -2
- package/dist/form/comboBoxCore.svelte.d.ts +99 -0
- package/dist/form/comboBoxCore.svelte.js +243 -0
- package/dist/icon/Icon.svelte +8 -3
- package/dist/icon/Icon.svelte.d.ts +8 -3
- package/dist/icon/cube-send.svg +1 -0
- package/dist/icon/file-type-bmp.svg +1 -0
- package/dist/icon/file-type-csv.svg +1 -0
- package/dist/icon/file-type-doc.svg +1 -0
- package/dist/icon/file-type-docx.svg +1 -0
- package/dist/icon/file-type-jpg.svg +1 -0
- package/dist/icon/file-type-pdf.svg +1 -0
- package/dist/icon/file-type-png.svg +1 -0
- package/dist/icon/file-type-ppt.svg +1 -0
- package/dist/icon/file-type-svg.svg +1 -0
- package/dist/icon/file-type-txt.svg +1 -0
- package/dist/icon/file-type-xls.svg +1 -0
- package/dist/icon/file-type-zip.svg +1 -0
- package/dist/icon/index.d.ts +166 -145
- package/dist/icon/index.js +166 -146
- package/dist/icon/layout-sidebar-left-collapse.svg +1 -0
- package/dist/icon/layout-sidebar-left-expand.svg +1 -0
- package/dist/icon/logo-placeholder.svg +6 -0
- package/dist/icon/paperclip.svg +1 -0
- package/dist/icon/source-code.svg +1 -0
- package/dist/icon/sun-moon.svg +1 -0
- package/dist/icon/table.svg +6 -0
- package/dist/icon/thumb-down.svg +1 -0
- package/dist/icon/thumb-up.svg +1 -0
- package/dist/index.d.ts +93 -22
- package/dist/index.js +28 -27
- package/dist/layout/AppShell.svelte +12 -162
- package/dist/layout/AppShell.svelte.d.ts +6 -27
- package/dist/layout/CustomNavbar.svelte +9 -7
- package/dist/layout/CustomNavbar.svelte.d.ts +4 -2
- package/dist/layout/Navbar.svelte +158 -110
- package/dist/layout/Navbar.svelte.d.ts +26 -12
- package/dist/layout/NavbarItemDisplay.svelte +2 -2
- package/dist/layout/NavbarItemView.svelte +182 -0
- package/dist/layout/NavbarItemView.svelte.d.ts +10 -0
- package/dist/layout/Sidenav.svelte +280 -341
- package/dist/layout/Sidenav.svelte.d.ts +36 -4
- package/dist/models/ComboBoxItem.d.ts +2 -0
- package/dist/models/Employee.d.ts +53 -0
- package/dist/models/Employee.js +23 -0
- package/dist/models/Hyperlink.d.ts +3 -1
- package/dist/models/LinkCollectionItem.d.ts +3 -1
- package/dist/models/NavbarItem.d.ts +6 -2
- package/dist/theme.svelte.d.ts +0 -1
- package/dist/theme.svelte.js +46 -58
- package/dist/ui/Accordion.svelte +81 -242
- package/dist/ui/Accordion.svelte.d.ts +37 -14
- package/dist/ui/AccordionItem.svelte +303 -0
- package/dist/ui/AccordionItem.svelte.d.ts +21 -0
- package/dist/ui/ActionIcon.svelte +25 -21
- package/dist/ui/ActionIcon.svelte.d.ts +15 -2
- package/dist/ui/Badge.svelte +170 -161
- package/dist/ui/Badge.svelte.d.ts +16 -4
- package/dist/ui/Button.svelte +178 -205
- package/dist/ui/Button.svelte.d.ts +19 -2
- package/dist/ui/ButtonVariant.d.ts +15 -1
- package/dist/ui/ContextMenu.svelte +146 -0
- package/dist/ui/ContextMenu.svelte.d.ts +37 -0
- package/dist/ui/ContextMenuList.svelte +188 -0
- package/dist/ui/ContextMenuList.svelte.d.ts +12 -0
- package/dist/ui/Dialog.svelte +183 -104
- package/dist/ui/Dialog.svelte.d.ts +21 -2
- package/dist/ui/Drawer.svelte +237 -184
- package/dist/ui/Drawer.svelte.d.ts +20 -2
- package/dist/ui/Dropdown.svelte +24 -14
- package/dist/ui/Dropdown.svelte.d.ts +11 -2
- package/dist/ui/Dropzone.svelte +159 -57
- package/dist/ui/Dropzone.svelte.d.ts +29 -2
- package/dist/ui/Link.svelte +12 -4
- package/dist/ui/Link.svelte.d.ts +8 -2
- package/dist/ui/Loader.svelte +23 -18
- package/dist/ui/Loader.svelte.d.ts +5 -2
- package/dist/ui/Logo.svelte +37 -0
- package/dist/ui/Logo.svelte.d.ts +16 -0
- package/dist/ui/MultiSortable.svelte +287 -0
- package/dist/ui/MultiSortable.svelte.d.ts +50 -0
- package/dist/ui/Pagination.svelte +12 -6
- package/dist/ui/Pagination.svelte.d.ts +6 -2
- package/dist/ui/Popover.svelte +43 -65
- package/dist/ui/Popover.svelte.d.ts +14 -5
- package/dist/ui/ProgressBar.svelte +169 -0
- package/dist/ui/ProgressBar.svelte.d.ts +30 -0
- package/dist/ui/ProgressBarVariant.d.ts +7 -0
- package/dist/ui/ProgressBarVariant.js +1 -0
- package/dist/ui/SegmentedControl.svelte +0 -0
- package/dist/ui/SegmentedControl.svelte.d.ts +26 -0
- package/dist/ui/Sortable.svelte +163 -0
- package/dist/ui/Sortable.svelte.d.ts +47 -0
- package/dist/ui/Table.svelte +497 -56
- package/dist/ui/Table.svelte.d.ts +64 -2
- package/dist/ui/Tabs.svelte +22 -18
- package/dist/ui/Tabs.svelte.d.ts +6 -2
- package/dist/ui/ThemeSwitcher.svelte +26 -7
- package/dist/ui/ThemeSwitcher.svelte.d.ts +4 -2
- package/dist/ui/Tooltip.svelte +312 -180
- package/dist/ui/Tooltip.svelte.d.ts +4 -3
- package/dist/uiTheme.svelte.d.ts +86 -0
- package/dist/uiTheme.svelte.js +214 -0
- package/dist/util/DateFunctions.js +1 -1
- package/dist/util/DragDrop.d.ts +50 -0
- package/dist/util/DragDrop.js +154 -0
- package/dist/util/NavigateTo.js +2 -2
- package/dist/util/dayjs.d.ts +4 -0
- package/dist/util/dayjs.js +15 -0
- package/dist/util/interceptLinkClick.d.ts +13 -0
- package/dist/util/interceptLinkClick.js +33 -0
- package/package.json +66 -26
- package/dist/display/Alert.svelte +0 -179
- package/dist/display/Alert.svelte.d.ts +0 -13
- package/dist/form/FileInput.svelte +0 -235
- package/dist/form/FileInput.svelte.d.ts +0 -23
- package/dist/form/PasswordInput.svelte +0 -252
- package/dist/form/PasswordInput.svelte.d.ts +0 -33
- package/dist/form/Rating.svelte +0 -235
- package/dist/form/Rating.svelte.d.ts +0 -21
- package/dist/styles/components.css +0 -199
- package/dist/styles/dark.css +0 -146
- package/dist/styles/index.css +0 -116
- package/dist/styles/reset.css +0 -110
- package/dist/styles/semantic.css +0 -86
- package/dist/styles/tokens.css +0 -203
- package/dist/styles/utilities.css +0 -523
- package/dist/ui/Breadcrumbs.svelte +0 -131
- package/dist/ui/Breadcrumbs.svelte.d.ts +0 -16
- package/dist/ui/LoadingOverlay.svelte +0 -53
- package/dist/ui/LoadingOverlay.svelte.d.ts +0 -11
- package/dist/ui/Progress.svelte +0 -191
- package/dist/ui/Progress.svelte.d.ts +0 -15
- package/dist/ui/RingProgress.svelte +0 -141
- package/dist/ui/RingProgress.svelte.d.ts +0 -18
- package/dist/ui/Skeleton.svelte +0 -85
- package/dist/ui/Skeleton.svelte.d.ts +0 -12
- package/dist/ui/Stepper.svelte +0 -355
- package/dist/ui/Stepper.svelte.d.ts +0 -24
- package/dist/ui/Timeline.svelte +0 -225
- package/dist/ui/Timeline.svelte.d.ts +0 -23
- /package/dist/{actions → util}/ClickOutside.d.ts +0 -0
- /package/dist/{actions → util}/ClickOutside.js +0 -0
- /package/dist/{transitions → util}/Transitions.d.ts +0 -0
- /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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|
-
}:
|
|
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={
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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:
|
|
88
|
-
font-size:
|
|
89
|
-
font-weight:
|
|
90
|
-
line-height:
|
|
91
|
-
color: var(--
|
|
92
|
-
background-color: var(--
|
|
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(--
|
|
95
|
-
border-radius:
|
|
129
|
+
border: 1px solid var(--border-color);
|
|
130
|
+
border-radius: 0.375rem;
|
|
96
131
|
appearance: none;
|
|
97
|
-
transition: border-color
|
|
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:
|
|
136
|
+
color: #6c757d;
|
|
102
137
|
opacity: 1;
|
|
103
138
|
}
|
|
104
139
|
|
|
105
140
|
&:focus {
|
|
106
|
-
border-color: var(--
|
|
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(--
|
|
113
|
-
opacity:
|
|
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(--
|
|
120
|
-
color: var(--
|
|
121
|
-
border-color: var(--
|
|
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:
|
|
159
|
+
color: #9ca3af;
|
|
125
160
|
}
|
|
126
161
|
|
|
127
162
|
&:focus {
|
|
128
|
-
border-color: var(--
|
|
163
|
+
border-color: var(--ui-accent);
|
|
129
164
|
}
|
|
130
165
|
|
|
131
166
|
&:disabled {
|
|
132
|
-
background-color: var(--
|
|
133
|
-
|
|
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:
|
|
140
|
-
border-color: var(--
|
|
174
|
+
background-color: #2f353b;
|
|
175
|
+
border-color: var(--border-color);
|
|
141
176
|
}
|
|
142
177
|
|
|
143
178
|
.loader {
|
|
144
179
|
position: absolute;
|
|
145
|
-
right:
|
|
146
|
-
top:
|
|
180
|
+
right: 8px;
|
|
181
|
+
top: 8px;
|
|
147
182
|
}
|
|
148
183
|
</style>
|
|
@@ -1,26 +1,51 @@
|
|
|
1
|
-
interface
|
|
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
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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<
|
|
49
|
+
declare const TextArea: import("svelte").Component<TextAreaProps, {}, "value">;
|
|
25
50
|
type TextArea = ReturnType<typeof TextArea>;
|
|
26
51
|
export default TextArea;
|
package/dist/form/Textbox.svelte
CHANGED
|
@@ -4,48 +4,83 @@
|
|
|
4
4
|
import Loader from '../ui/Loader.svelte';
|
|
5
5
|
import Icon from '../icon/Icon.svelte';
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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
|
-
|
|
35
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
}:
|
|
74
|
-
|
|
75
|
-
// Generate ID on client-side only to avoid hydration mismatches
|
|
76
|
-
let autoId = $state('');
|
|
109
|
+
}: TextboxProps = $props();
|
|
77
110
|
|
|
78
|
-
$
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
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={
|
|
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?.(
|
|
152
|
+
onblur?.(value, e);
|
|
126
153
|
}}
|
|
127
|
-
onfocus={() => {
|
|
154
|
+
onfocus={(e) => {
|
|
128
155
|
isFocused = true;
|
|
129
|
-
onfocus?.(
|
|
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:
|
|
178
|
-
line-height:
|
|
179
|
-
padding:
|
|
180
|
-
border: 1px solid var(--
|
|
181
|
-
background-color: var(--
|
|
182
|
-
color: var(--
|
|
183
|
-
border-radius:
|
|
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(--
|
|
218
|
+
background: var(--border-color);
|
|
191
219
|
}
|
|
192
220
|
|
|
193
221
|
.textbox:focus {
|
|
194
|
-
border-color: var(--
|
|
222
|
+
border-color: var(--accent-color);
|
|
195
223
|
outline: 2px solid transparent;
|
|
196
|
-
outline-offset:
|
|
224
|
+
outline-offset: 2px;
|
|
197
225
|
|
|
198
226
|
& ~ .left-icon {
|
|
199
|
-
color: var(--
|
|
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:
|
|
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:
|
|
218
|
-
color:
|
|
250
|
+
left: 0.5rem;
|
|
251
|
+
color: rgb(115 115 115);
|
|
219
252
|
}
|
|
220
253
|
|
|
221
254
|
.show-error {
|
|
222
|
-
border-color: var(--
|
|
255
|
+
border-color: var(--danger-text);
|
|
223
256
|
}
|
|
224
257
|
|
|
225
258
|
.text-error {
|
|
226
|
-
color: var(--
|
|
259
|
+
color: var(--danger-text);
|
|
227
260
|
}
|
|
228
261
|
</style>
|
|
@@ -1,37 +1,70 @@
|
|
|
1
1
|
import { type Snippet } from 'svelte';
|
|
2
|
-
interface
|
|
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
|
-
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-
|
|
30
|
-
|
|
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
|
-
|
|
65
|
+
/** Input type */
|
|
66
|
+
type?: 'text' | 'password' | 'email' | 'number' | 'search' | 'tel' | 'url';
|
|
34
67
|
}
|
|
35
|
-
declare const Textbox: import("svelte").Component<
|
|
68
|
+
declare const Textbox: import("svelte").Component<TextboxProps, {}, "value" | "textboxElement">;
|
|
36
69
|
type Textbox = ReturnType<typeof Textbox>;
|
|
37
70
|
export default Textbox;
|