@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,13 +1,21 @@
|
|
|
1
|
-
interface
|
|
1
|
+
export interface DateTimePickerProps {
|
|
2
|
+
/** Label text displayed above the picker */
|
|
2
3
|
label?: string;
|
|
4
|
+
/** Disable the date/time picker */
|
|
3
5
|
disabled?: boolean;
|
|
6
|
+
/** Mark field as required (shows asterisk) */
|
|
4
7
|
required?: boolean;
|
|
8
|
+
/** CSS classes for the container element */
|
|
5
9
|
containerClass?: string;
|
|
10
|
+
/** Selected date/time value in ISO format (bindable) */
|
|
6
11
|
value?: string | undefined;
|
|
12
|
+
/** Minimum selectable date/time in ISO format */
|
|
7
13
|
minDate?: string | undefined;
|
|
14
|
+
/** Maximum selectable date/time in ISO format */
|
|
8
15
|
maxDate?: string | undefined;
|
|
16
|
+
/** Callback when selected date/time changes */
|
|
9
17
|
onchange?: (date: string | undefined) => void;
|
|
10
18
|
}
|
|
11
|
-
declare const DateTimePicker: import("svelte").Component<
|
|
19
|
+
declare const DateTimePicker: import("svelte").Component<DateTimePickerProps, {}, "value">;
|
|
12
20
|
type DateTimePicker = ReturnType<typeof DateTimePicker>;
|
|
13
21
|
export default DateTimePicker;
|
|
@@ -1,20 +1,33 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { Icon, iconInfoCircle } from '../icon/index.js';
|
|
3
|
-
import Tooltip from '../ui/Tooltip.svelte';
|
|
1
|
+
<script module lang="ts">
|
|
4
2
|
import type { Snippet } from 'svelte';
|
|
5
3
|
|
|
6
|
-
interface
|
|
4
|
+
export interface FormGroupProps {
|
|
5
|
+
/** Label text displayed above the form field */
|
|
7
6
|
label: string;
|
|
7
|
+
/** Mark field as required (shows asterisk) */
|
|
8
8
|
required?: boolean;
|
|
9
|
+
/** Custom ID for the form field */
|
|
9
10
|
id?: string;
|
|
11
|
+
/** Additional CSS classes */
|
|
10
12
|
class?: string;
|
|
13
|
+
/** Show error state styling */
|
|
11
14
|
showError?: boolean;
|
|
15
|
+
/** Error message to display */
|
|
12
16
|
errorText?: string;
|
|
17
|
+
/** Rich tooltip content using a Svelte snippet */
|
|
13
18
|
tooltipContent?: Snippet;
|
|
19
|
+
/** Simple tooltip text */
|
|
14
20
|
tooltipText?: string;
|
|
21
|
+
/** Position of the tooltip */
|
|
15
22
|
tooltipLocation?: 'top' | 'bottom' | 'left' | 'right';
|
|
23
|
+
/** Form field content */
|
|
16
24
|
children: Snippet;
|
|
17
25
|
}
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
<script lang="ts">
|
|
29
|
+
import { Icon, iconInfoCircle } from '../icon/index.js';
|
|
30
|
+
import Tooltip from '../ui/Tooltip.svelte';
|
|
18
31
|
|
|
19
32
|
let {
|
|
20
33
|
label,
|
|
@@ -27,7 +40,7 @@
|
|
|
27
40
|
tooltipText,
|
|
28
41
|
tooltipLocation = 'top',
|
|
29
42
|
children
|
|
30
|
-
}:
|
|
43
|
+
}: FormGroupProps = $props();
|
|
31
44
|
|
|
32
45
|
const computedId = $derived(id ?? `form-${label}`);
|
|
33
46
|
</script>
|
|
@@ -56,13 +69,23 @@
|
|
|
56
69
|
|
|
57
70
|
<style>
|
|
58
71
|
.label {
|
|
59
|
-
|
|
60
|
-
|
|
72
|
+
display: flex;
|
|
73
|
+
align-items: center;
|
|
74
|
+
gap: 0.25rem;
|
|
75
|
+
font-size: 0.875rem;
|
|
76
|
+
line-height: 1.25rem;
|
|
77
|
+
font-weight: 500;
|
|
78
|
+
margin-bottom: 0.25rem;
|
|
79
|
+
color: var(--label-color, var(--bs-secondary, #6c757d));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.text-required {
|
|
83
|
+
color: var(--danger-text);
|
|
61
84
|
}
|
|
62
85
|
|
|
63
86
|
.error-text {
|
|
64
|
-
color: var(--
|
|
65
|
-
font-size:
|
|
66
|
-
margin-top:
|
|
87
|
+
color: var(--danger-text);
|
|
88
|
+
font-size: 0.875rem;
|
|
89
|
+
margin-top: 0.25rem;
|
|
67
90
|
}
|
|
68
91
|
</style>
|
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
|
-
interface
|
|
2
|
+
export interface FormGroupProps {
|
|
3
|
+
/** Label text displayed above the form field */
|
|
3
4
|
label: string;
|
|
5
|
+
/** Mark field as required (shows asterisk) */
|
|
4
6
|
required?: boolean;
|
|
7
|
+
/** Custom ID for the form field */
|
|
5
8
|
id?: string;
|
|
9
|
+
/** Additional CSS classes */
|
|
6
10
|
class?: string;
|
|
11
|
+
/** Show error state styling */
|
|
7
12
|
showError?: boolean;
|
|
13
|
+
/** Error message to display */
|
|
8
14
|
errorText?: string;
|
|
15
|
+
/** Rich tooltip content using a Svelte snippet */
|
|
9
16
|
tooltipContent?: Snippet;
|
|
17
|
+
/** Simple tooltip text */
|
|
10
18
|
tooltipText?: string;
|
|
19
|
+
/** Position of the tooltip */
|
|
11
20
|
tooltipLocation?: 'top' | 'bottom' | 'left' | 'right';
|
|
21
|
+
/** Form field content */
|
|
12
22
|
children: Snippet;
|
|
13
23
|
}
|
|
14
|
-
declare const FormGroup: import("svelte").Component<
|
|
24
|
+
declare const FormGroup: import("svelte").Component<FormGroupProps, {}, "">;
|
|
15
25
|
type FormGroup = ReturnType<typeof FormGroup>;
|
|
16
26
|
export default FormGroup;
|
package/dist/form/Number.svelte
CHANGED
|
@@ -4,47 +4,83 @@
|
|
|
4
4
|
import Loader from '../ui/Loader.svelte';
|
|
5
5
|
import Icon from '../icon/Icon.svelte';
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
const autoName = `number-${crypto.randomUUID()}`;
|
|
8
|
+
|
|
9
|
+
export interface NumberProps {
|
|
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
|
-
|
|
22
|
+
/** HTML autocomplete attribute for the input */
|
|
23
|
+
autocomplete?: string;
|
|
24
|
+
/** Show loading spinner inside the input */
|
|
14
25
|
loading?: boolean;
|
|
26
|
+
/** CSS classes for the FormGroup wrapper */
|
|
15
27
|
groupClass?: string;
|
|
28
|
+
/** Reference to the input DOM element */
|
|
16
29
|
numberElement?: HTMLElement;
|
|
30
|
+
/** SVG icon displayed on the left side */
|
|
17
31
|
leftIconSvg?: string;
|
|
32
|
+
/** CSS classes for the input element */
|
|
18
33
|
class?: string;
|
|
34
|
+
/** CSS classes for the container element */
|
|
19
35
|
containerClass?: string;
|
|
36
|
+
/** Disable the input */
|
|
20
37
|
disabled?: boolean;
|
|
38
|
+
/** Input value (bindable) */
|
|
21
39
|
value?: number;
|
|
40
|
+
/** Whether the input is currently focused */
|
|
22
41
|
isFocused?: boolean;
|
|
42
|
+
/** Show error state styling */
|
|
23
43
|
showError?: boolean;
|
|
44
|
+
/** Error message to display */
|
|
24
45
|
errorText?: string;
|
|
46
|
+
/** Position of the tooltip */
|
|
25
47
|
tooltipLocation?: 'top' | 'bottom' | 'left' | 'right';
|
|
48
|
+
/** Minimum allowed value */
|
|
26
49
|
min?: number;
|
|
50
|
+
/** Maximum allowed value */
|
|
27
51
|
max?: number;
|
|
52
|
+
/** Increment/decrement step value */
|
|
28
53
|
step?: number;
|
|
29
|
-
|
|
54
|
+
/** Callback when Enter key is pressed */
|
|
55
|
+
onenter?: (value: number) => void;
|
|
56
|
+
/** Callback when value changes */
|
|
30
57
|
onchange?: (e: Event) => void;
|
|
58
|
+
/** Callback on input event */
|
|
31
59
|
oninput?: (e: Event) => void;
|
|
60
|
+
/** Callback on keydown event */
|
|
32
61
|
onkeydown?: (e: KeyboardEvent) => void;
|
|
62
|
+
/** Callback on keypress event */
|
|
33
63
|
onkeypress?: (e: KeyboardEvent) => void;
|
|
64
|
+
/** Callback on keyup event */
|
|
34
65
|
onkeyup?: (e: KeyboardEvent) => void;
|
|
35
|
-
|
|
36
|
-
|
|
66
|
+
/** Callback when input gains focus */
|
|
67
|
+
onfocus?: (value: number | undefined, e: FocusEvent) => void;
|
|
68
|
+
/** Callback when input loses focus */
|
|
69
|
+
onblur?: (value: number | undefined, e: FocusEvent) => void;
|
|
70
|
+
/** Content to render on the right side of the input */
|
|
37
71
|
right?: Snippet;
|
|
72
|
+
/** Additional content below the input */
|
|
38
73
|
children?: Snippet;
|
|
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
|
-
|
|
83
|
+
autocomplete = undefined,
|
|
48
84
|
loading = false,
|
|
49
85
|
class: classes = '',
|
|
50
86
|
containerClass = '',
|
|
@@ -70,7 +106,11 @@
|
|
|
70
106
|
onblur = undefined,
|
|
71
107
|
right,
|
|
72
108
|
children
|
|
73
|
-
}:
|
|
109
|
+
}: NumberProps = $props();
|
|
110
|
+
|
|
111
|
+
let resolvedName = $derived(
|
|
112
|
+
(name || label || autoName).replace(/[^a-zA-Z0-9_\-:.]/g, '_')
|
|
113
|
+
);
|
|
74
114
|
|
|
75
115
|
let id = $derived.by(() => {
|
|
76
116
|
if (inputId) return inputId;
|
|
@@ -121,6 +161,7 @@
|
|
|
121
161
|
class="number {classes} {extraClasses.join(' ')}"
|
|
122
162
|
type="number"
|
|
123
163
|
{id}
|
|
164
|
+
name={resolvedName}
|
|
124
165
|
{placeholder}
|
|
125
166
|
{disabled}
|
|
126
167
|
{autofocus}
|
|
@@ -128,16 +169,16 @@
|
|
|
128
169
|
{min}
|
|
129
170
|
{max}
|
|
130
171
|
{step}
|
|
131
|
-
autocomplete={
|
|
172
|
+
autocomplete={autocomplete as any}
|
|
132
173
|
bind:value
|
|
133
174
|
bind:this={numberElement}
|
|
134
|
-
onblur={() => {
|
|
175
|
+
onblur={(e) => {
|
|
135
176
|
isFocused = false;
|
|
136
|
-
onblur?.(
|
|
177
|
+
onblur?.(value, e);
|
|
137
178
|
}}
|
|
138
|
-
onfocus={() => {
|
|
179
|
+
onfocus={(e) => {
|
|
139
180
|
isFocused = true;
|
|
140
|
-
onfocus?.(
|
|
181
|
+
onfocus?.(value, e);
|
|
141
182
|
}}
|
|
142
183
|
onchange={handleChange}
|
|
143
184
|
{oninput}
|
|
@@ -185,29 +226,30 @@
|
|
|
185
226
|
|
|
186
227
|
.number {
|
|
187
228
|
width: 100%;
|
|
188
|
-
font-size:
|
|
189
|
-
line-height:
|
|
190
|
-
padding:
|
|
191
|
-
border: 1px solid var(--
|
|
192
|
-
background-color: var(--
|
|
193
|
-
color: var(--
|
|
194
|
-
border-radius:
|
|
229
|
+
font-size: 1rem;
|
|
230
|
+
line-height: 1.5rem;
|
|
231
|
+
padding: 0.25rem;
|
|
232
|
+
border: 1px solid var(--border-color);
|
|
233
|
+
background-color: var(--input-bg-color);
|
|
234
|
+
color: var(--text-color);
|
|
235
|
+
border-radius: 0.25rem;
|
|
236
|
+
padding: 0.25rem 0.5rem;
|
|
195
237
|
box-sizing: border-box;
|
|
196
238
|
}
|
|
197
239
|
|
|
198
240
|
.number.disabled {
|
|
199
241
|
opacity: 0.5;
|
|
200
242
|
cursor: not-allowed;
|
|
201
|
-
background: var(--
|
|
243
|
+
background: var(--border-color);
|
|
202
244
|
}
|
|
203
245
|
|
|
204
246
|
.number:focus {
|
|
205
|
-
border-color: var(--
|
|
247
|
+
border-color: var(--accent-color);
|
|
206
248
|
outline: 2px solid transparent;
|
|
207
|
-
outline-offset:
|
|
249
|
+
outline-offset: 2px;
|
|
208
250
|
|
|
209
251
|
& ~ .left-icon {
|
|
210
|
-
color: var(--
|
|
252
|
+
color: var(--accent-color);
|
|
211
253
|
}
|
|
212
254
|
}
|
|
213
255
|
|
|
@@ -217,7 +259,7 @@
|
|
|
217
259
|
}
|
|
218
260
|
|
|
219
261
|
.with-left-icon {
|
|
220
|
-
padding-left:
|
|
262
|
+
padding-left: 2rem;
|
|
221
263
|
}
|
|
222
264
|
|
|
223
265
|
.left-icon {
|
|
@@ -225,15 +267,15 @@
|
|
|
225
267
|
pointer-events: none;
|
|
226
268
|
top: 50%;
|
|
227
269
|
transform: translateY(-40%);
|
|
228
|
-
left:
|
|
229
|
-
color:
|
|
270
|
+
left: 0.5rem;
|
|
271
|
+
color: rgb(115 115 115);
|
|
230
272
|
}
|
|
231
273
|
|
|
232
274
|
.show-error {
|
|
233
|
-
border-color: var(--
|
|
275
|
+
border-color: var(--danger-text);
|
|
234
276
|
}
|
|
235
277
|
|
|
236
278
|
.text-error {
|
|
237
|
-
color: var(--
|
|
279
|
+
color: var(--danger-text);
|
|
238
280
|
}
|
|
239
|
-
</style>
|
|
281
|
+
</style>
|
|
@@ -1,37 +1,70 @@
|
|
|
1
1
|
import { type Snippet } from 'svelte';
|
|
2
|
-
interface
|
|
2
|
+
export interface NumberProps {
|
|
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
|
-
|
|
15
|
+
/** HTML autocomplete attribute for the input */
|
|
16
|
+
autocomplete?: string;
|
|
17
|
+
/** Show loading spinner inside the input */
|
|
9
18
|
loading?: boolean;
|
|
19
|
+
/** CSS classes for the FormGroup wrapper */
|
|
10
20
|
groupClass?: string;
|
|
21
|
+
/** Reference to the input DOM element */
|
|
11
22
|
numberElement?: HTMLElement;
|
|
23
|
+
/** SVG icon displayed on the left side */
|
|
12
24
|
leftIconSvg?: string;
|
|
25
|
+
/** CSS classes for the input element */
|
|
13
26
|
class?: string;
|
|
27
|
+
/** CSS classes for the container element */
|
|
14
28
|
containerClass?: string;
|
|
29
|
+
/** Disable the input */
|
|
15
30
|
disabled?: boolean;
|
|
31
|
+
/** Input value (bindable) */
|
|
16
32
|
value?: number;
|
|
33
|
+
/** Whether the input is currently focused */
|
|
17
34
|
isFocused?: boolean;
|
|
35
|
+
/** Show error state styling */
|
|
18
36
|
showError?: boolean;
|
|
37
|
+
/** Error message to display */
|
|
19
38
|
errorText?: string;
|
|
39
|
+
/** Position of the tooltip */
|
|
20
40
|
tooltipLocation?: 'top' | 'bottom' | 'left' | 'right';
|
|
41
|
+
/** Minimum allowed value */
|
|
21
42
|
min?: number;
|
|
43
|
+
/** Maximum allowed value */
|
|
22
44
|
max?: number;
|
|
45
|
+
/** Increment/decrement step value */
|
|
23
46
|
step?: number;
|
|
24
|
-
|
|
47
|
+
/** Callback when Enter key is pressed */
|
|
48
|
+
onenter?: (value: number) => void;
|
|
49
|
+
/** Callback when value changes */
|
|
25
50
|
onchange?: (e: Event) => void;
|
|
51
|
+
/** Callback on input event */
|
|
26
52
|
oninput?: (e: Event) => void;
|
|
53
|
+
/** Callback on keydown event */
|
|
27
54
|
onkeydown?: (e: KeyboardEvent) => void;
|
|
55
|
+
/** Callback on keypress event */
|
|
28
56
|
onkeypress?: (e: KeyboardEvent) => void;
|
|
57
|
+
/** Callback on keyup event */
|
|
29
58
|
onkeyup?: (e: KeyboardEvent) => void;
|
|
30
|
-
|
|
31
|
-
|
|
59
|
+
/** Callback when input gains focus */
|
|
60
|
+
onfocus?: (value: number | undefined, e: FocusEvent) => void;
|
|
61
|
+
/** Callback when input loses focus */
|
|
62
|
+
onblur?: (value: number | undefined, e: FocusEvent) => void;
|
|
63
|
+
/** Content to render on the right side of the input */
|
|
32
64
|
right?: Snippet;
|
|
65
|
+
/** Additional content below the input */
|
|
33
66
|
children?: Snippet;
|
|
34
67
|
}
|
|
35
|
-
declare const Number: import("svelte").Component<
|
|
68
|
+
declare const Number: import("svelte").Component<NumberProps, {}, "value" | "numberElement">;
|
|
36
69
|
type Number = ReturnType<typeof Number>;
|
|
37
70
|
export default Number;
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
export interface RadioProps {
|
|
3
|
+
/** HTML name attribute for the radio input */
|
|
4
|
+
name?: string;
|
|
5
|
+
/** Label text displayed next to the radio */
|
|
6
|
+
label?: string;
|
|
7
|
+
/** Custom ID for the input element */
|
|
8
|
+
id?: string;
|
|
9
|
+
/** Additional CSS classes */
|
|
10
|
+
class?: string;
|
|
11
|
+
/** Disable the radio */
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
/** Whether the radio is checked (bindable) */
|
|
14
|
+
checked?: boolean;
|
|
15
|
+
/** When true, the radio state is controlled externally only. Clicking will call onchange but won't toggle the radio. */
|
|
16
|
+
controlled?: boolean;
|
|
17
|
+
/** Callback when checked state changes */
|
|
18
|
+
onchange?: (checked: boolean) => void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const nonce = Math.random().toString(36).substring(2, 15);
|
|
22
|
+
|
|
23
|
+
let {
|
|
24
|
+
name,
|
|
25
|
+
label,
|
|
26
|
+
id = `radio-${nonce}`,
|
|
27
|
+
class: classes = '',
|
|
28
|
+
disabled = false,
|
|
29
|
+
checked = $bindable(false),
|
|
30
|
+
controlled = false,
|
|
31
|
+
onchange = undefined
|
|
32
|
+
}: RadioProps = $props();
|
|
33
|
+
</script>
|
|
34
|
+
|
|
35
|
+
<div class="radio-wrapper {disabled ? 'disabled' : ''}">
|
|
36
|
+
<label class={disabled ? 'cursor-not-allowed' : ''} for={id}>
|
|
37
|
+
<input
|
|
38
|
+
{id}
|
|
39
|
+
type="radio"
|
|
40
|
+
class="accent-accent {classes}"
|
|
41
|
+
{name}
|
|
42
|
+
{disabled}
|
|
43
|
+
{checked}
|
|
44
|
+
onchange={(e) => {
|
|
45
|
+
if (controlled) {
|
|
46
|
+
e.currentTarget.checked = checked;
|
|
47
|
+
onchange?.(!checked);
|
|
48
|
+
} else {
|
|
49
|
+
checked = e.currentTarget.checked;
|
|
50
|
+
onchange?.(checked);
|
|
51
|
+
}
|
|
52
|
+
}}
|
|
53
|
+
/>
|
|
54
|
+
{#if label}
|
|
55
|
+
{label}
|
|
56
|
+
{/if}
|
|
57
|
+
</label>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<style>
|
|
61
|
+
label {
|
|
62
|
+
display: flex;
|
|
63
|
+
flex-direction: row;
|
|
64
|
+
align-items: center;
|
|
65
|
+
user-select: none;
|
|
66
|
+
cursor: pointer;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.disabled label,
|
|
70
|
+
.disabled input {
|
|
71
|
+
cursor: not-allowed;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
input {
|
|
75
|
+
position: relative !important;
|
|
76
|
+
-webkit-appearance: none;
|
|
77
|
+
-moz-appearance: none;
|
|
78
|
+
appearance: none;
|
|
79
|
+
margin: 8px;
|
|
80
|
+
box-sizing: content-box;
|
|
81
|
+
overflow: hidden;
|
|
82
|
+
cursor: pointer;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
input:before {
|
|
86
|
+
content: '';
|
|
87
|
+
display: block;
|
|
88
|
+
box-sizing: content-box;
|
|
89
|
+
width: 16px;
|
|
90
|
+
height: 16px;
|
|
91
|
+
border: 2px solid #ccc;
|
|
92
|
+
transition: 0.2s border-color ease;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
:global(.dark) input:before {
|
|
96
|
+
border-color: #666;
|
|
97
|
+
}
|
|
98
|
+
input:checked:before {
|
|
99
|
+
border-color: var(--ui-primary);
|
|
100
|
+
transition: 0.5s border-color ease;
|
|
101
|
+
}
|
|
102
|
+
:global(.dark) input:checked:before {
|
|
103
|
+
border-color: var(--ui-accent);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
input:disabled:before {
|
|
107
|
+
border-color: #ccc;
|
|
108
|
+
background-color: #ccc;
|
|
109
|
+
opacity: 0.5;
|
|
110
|
+
}
|
|
111
|
+
:global(.dark) input:disabled:before {
|
|
112
|
+
border-color: #666;
|
|
113
|
+
background-color: #666;
|
|
114
|
+
}
|
|
115
|
+
input:after {
|
|
116
|
+
content: '';
|
|
117
|
+
display: block;
|
|
118
|
+
position: absolute;
|
|
119
|
+
box-sizing: content-box;
|
|
120
|
+
top: 50%;
|
|
121
|
+
left: 50%;
|
|
122
|
+
transform-origin: 50% 50%;
|
|
123
|
+
background-color: var(--ui-primary);
|
|
124
|
+
width: 16px;
|
|
125
|
+
height: 16px;
|
|
126
|
+
border-radius: 100vh;
|
|
127
|
+
transform: translate(-50%, -50%) scale(0);
|
|
128
|
+
}
|
|
129
|
+
input:disabled:after {
|
|
130
|
+
opacity: 0.5;
|
|
131
|
+
}
|
|
132
|
+
:global(.dark) input:after {
|
|
133
|
+
background-color: var(--ui-accent);
|
|
134
|
+
}
|
|
135
|
+
input[type='radio']:before {
|
|
136
|
+
border-radius: 100vh;
|
|
137
|
+
}
|
|
138
|
+
input[type='radio']:after {
|
|
139
|
+
width: 16px;
|
|
140
|
+
height: 16px;
|
|
141
|
+
border-radius: 100vh;
|
|
142
|
+
transform: translate(-50%, -50%) scale(0);
|
|
143
|
+
}
|
|
144
|
+
input[type='radio']:checked:after {
|
|
145
|
+
-webkit-animation: toggleOnRadio 0.2s ease forwards;
|
|
146
|
+
animation: toggleOnRadio 0.2s ease forwards;
|
|
147
|
+
}
|
|
148
|
+
@-webkit-keyframes toggleOnRadio {
|
|
149
|
+
0% {
|
|
150
|
+
opacity: 0;
|
|
151
|
+
transform: translate(-50%, -50%) scale(0);
|
|
152
|
+
}
|
|
153
|
+
70% {
|
|
154
|
+
opacity: 1;
|
|
155
|
+
transform: translate(-50%, -50%) scale(0.9);
|
|
156
|
+
}
|
|
157
|
+
100% {
|
|
158
|
+
transform: translate(-50%, -50%) scale(0.8);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
@keyframes toggleOnRadio {
|
|
162
|
+
0% {
|
|
163
|
+
opacity: 0;
|
|
164
|
+
transform: translate(-50%, -50%) scale(0);
|
|
165
|
+
}
|
|
166
|
+
70% {
|
|
167
|
+
opacity: 1;
|
|
168
|
+
transform: translate(-50%, -50%) scale(0.9);
|
|
169
|
+
}
|
|
170
|
+
100% {
|
|
171
|
+
transform: translate(-50%, -50%) scale(0.8);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
</style>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface RadioProps {
|
|
2
|
+
/** HTML name attribute for the radio input */
|
|
3
|
+
name?: string;
|
|
4
|
+
/** Label text displayed next to the radio */
|
|
5
|
+
label?: string;
|
|
6
|
+
/** Custom ID for the input element */
|
|
7
|
+
id?: string;
|
|
8
|
+
/** Additional CSS classes */
|
|
9
|
+
class?: string;
|
|
10
|
+
/** Disable the radio */
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
/** Whether the radio is checked (bindable) */
|
|
13
|
+
checked?: boolean;
|
|
14
|
+
/** When true, the radio state is controlled externally only. Clicking will call onchange but won't toggle the radio. */
|
|
15
|
+
controlled?: boolean;
|
|
16
|
+
/** Callback when checked state changes */
|
|
17
|
+
onchange?: (checked: boolean) => void;
|
|
18
|
+
}
|
|
19
|
+
declare const Radio: import("svelte").Component<RadioProps, {}, "checked">;
|
|
20
|
+
type Radio = ReturnType<typeof Radio>;
|
|
21
|
+
export default Radio;
|