@makolabs/ripple 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +575 -8
  2. package/dist/adapters/storage/BaseAdapter.d.ts +20 -0
  3. package/dist/adapters/storage/BaseAdapter.js +171 -0
  4. package/dist/adapters/storage/S3Adapter.d.ts +21 -0
  5. package/dist/adapters/storage/S3Adapter.js +194 -0
  6. package/dist/adapters/storage/index.d.ts +3 -0
  7. package/dist/adapters/storage/index.js +3 -0
  8. package/dist/adapters/storage/types.d.ts +102 -0
  9. package/dist/adapters/storage/types.js +4 -0
  10. package/dist/button/Button.svelte +48 -0
  11. package/dist/button/Button.svelte.d.ts +4 -0
  12. package/dist/button/button.d.ts +113 -0
  13. package/dist/button/button.js +168 -0
  14. package/dist/charts/Chart.svelte +545 -0
  15. package/dist/charts/Chart.svelte.d.ts +4 -0
  16. package/dist/drawer/Drawer.svelte +224 -0
  17. package/dist/drawer/Drawer.svelte.d.ts +4 -0
  18. package/dist/drawer/drawer.d.ts +160 -0
  19. package/dist/drawer/drawer.js +80 -0
  20. package/dist/elements/accordion/Accordion.svelte +98 -0
  21. package/dist/elements/accordion/Accordion.svelte.d.ts +4 -0
  22. package/dist/elements/accordion/accordion.d.ts +227 -0
  23. package/dist/elements/accordion/accordion.js +138 -0
  24. package/dist/elements/alert/Alert.svelte +57 -0
  25. package/dist/elements/alert/Alert.svelte.d.ts +4 -0
  26. package/dist/elements/badge/Badge.svelte +43 -0
  27. package/dist/elements/badge/Badge.svelte.d.ts +4 -0
  28. package/dist/elements/badge/badge.d.ts +181 -0
  29. package/dist/elements/badge/badge.js +65 -0
  30. package/dist/elements/dropdown/Dropdown.svelte +234 -0
  31. package/dist/elements/dropdown/Dropdown.svelte.d.ts +4 -0
  32. package/dist/elements/dropdown/Select.svelte +333 -0
  33. package/dist/elements/dropdown/Select.svelte.d.ts +4 -0
  34. package/dist/elements/dropdown/dropdown.d.ts +251 -0
  35. package/dist/elements/dropdown/dropdown.js +95 -0
  36. package/dist/elements/dropdown/select.d.ts +200 -0
  37. package/dist/elements/dropdown/select.js +82 -0
  38. package/dist/elements/file-upload/FileUpload.svelte +135 -0
  39. package/dist/elements/file-upload/FileUpload.svelte.d.ts +4 -0
  40. package/dist/elements/file-upload/FilesPreview.svelte +93 -0
  41. package/dist/elements/file-upload/FilesPreview.svelte.d.ts +4 -0
  42. package/dist/elements/progress/Progress.svelte +145 -0
  43. package/dist/elements/progress/Progress.svelte.d.ts +4 -0
  44. package/dist/elements/timeline/Timeline.svelte +92 -0
  45. package/dist/elements/timeline/Timeline.svelte.d.ts +7 -0
  46. package/dist/file-browser/FileBrowser.svelte +877 -0
  47. package/dist/file-browser/FileBrowser.svelte.d.ts +14 -0
  48. package/dist/file-browser/index.d.ts +1 -0
  49. package/dist/file-browser/index.js +1 -0
  50. package/dist/filters/CompactFilters.svelte +147 -0
  51. package/dist/filters/CompactFilters.svelte.d.ts +4 -0
  52. package/dist/filters/index.d.ts +1 -0
  53. package/dist/filters/index.js +1 -0
  54. package/dist/forms/Checkbox.svelte +54 -0
  55. package/dist/forms/Checkbox.svelte.d.ts +4 -0
  56. package/dist/forms/DateRange.svelte +493 -0
  57. package/dist/forms/DateRange.svelte.d.ts +4 -0
  58. package/dist/forms/Form.svelte +39 -0
  59. package/dist/forms/Form.svelte.d.ts +4 -0
  60. package/dist/forms/Input.svelte +86 -0
  61. package/dist/forms/Input.svelte.d.ts +4 -0
  62. package/dist/forms/NumberInput.svelte +159 -0
  63. package/dist/forms/NumberInput.svelte.d.ts +4 -0
  64. package/dist/forms/RadioInputs.svelte +64 -0
  65. package/dist/forms/RadioInputs.svelte.d.ts +4 -0
  66. package/dist/forms/RadioPill.svelte +66 -0
  67. package/dist/forms/RadioPill.svelte.d.ts +4 -0
  68. package/dist/forms/Slider.svelte +342 -0
  69. package/dist/forms/Slider.svelte.d.ts +4 -0
  70. package/dist/forms/Tags.svelte +181 -0
  71. package/dist/forms/Tags.svelte.d.ts +4 -0
  72. package/dist/forms/Toggle.svelte +132 -0
  73. package/dist/forms/Toggle.svelte.d.ts +4 -0
  74. package/dist/forms/slider.d.ts +143 -0
  75. package/dist/forms/slider.js +62 -0
  76. package/dist/header/Breadcrumbs.svelte +73 -0
  77. package/dist/header/Breadcrumbs.svelte.d.ts +4 -0
  78. package/dist/header/PageHeader.svelte +68 -0
  79. package/dist/header/PageHeader.svelte.d.ts +4 -0
  80. package/dist/header/breadcrumbs.d.ts +226 -0
  81. package/dist/header/breadcrumbs.js +87 -0
  82. package/dist/helper/cls.d.ts +1 -0
  83. package/dist/helper/cls.js +4 -0
  84. package/dist/helper/date.d.ts +7 -0
  85. package/dist/helper/date.js +15 -0
  86. package/dist/helper/nav.svelte.d.ts +6 -0
  87. package/dist/helper/nav.svelte.js +23 -0
  88. package/dist/index.d.ts +856 -1
  89. package/dist/index.js +78 -1
  90. package/dist/layout/card/Card.svelte +41 -0
  91. package/dist/layout/card/Card.svelte.d.ts +4 -0
  92. package/dist/layout/card/MetricCard.svelte +64 -0
  93. package/dist/layout/card/MetricCard.svelte.d.ts +4 -0
  94. package/dist/layout/card/StatsCard.svelte +266 -0
  95. package/dist/layout/card/StatsCard.svelte.d.ts +4 -0
  96. package/dist/layout/card/card.d.ts +128 -0
  97. package/dist/layout/card/card.js +51 -0
  98. package/dist/layout/card/metric-card.d.ts +49 -0
  99. package/dist/layout/card/metric-card.js +10 -0
  100. package/dist/layout/card/stats-card.d.ts +191 -0
  101. package/dist/layout/card/stats-card.js +73 -0
  102. package/dist/layout/navbar/Navbar.svelte +206 -0
  103. package/dist/layout/navbar/Navbar.svelte.d.ts +4 -0
  104. package/dist/layout/navbar/navbar.d.ts +205 -0
  105. package/dist/layout/navbar/navbar.js +98 -0
  106. package/dist/layout/sidebar/NavGroup.svelte +91 -0
  107. package/dist/layout/sidebar/NavGroup.svelte.d.ts +4 -0
  108. package/dist/layout/sidebar/NavItem.svelte +29 -0
  109. package/dist/layout/sidebar/NavItem.svelte.d.ts +4 -0
  110. package/dist/layout/sidebar/Sidebar.svelte +193 -0
  111. package/dist/layout/sidebar/Sidebar.svelte.d.ts +4 -0
  112. package/dist/layout/table/Cells.svelte +111 -0
  113. package/dist/layout/table/Cells.svelte.d.ts +27 -0
  114. package/dist/layout/table/Table.svelte +790 -0
  115. package/dist/layout/table/Table.svelte.d.ts +4 -0
  116. package/dist/layout/table/table.d.ts +256 -0
  117. package/dist/layout/table/table.js +141 -0
  118. package/dist/layout/tabs/Tab.svelte +60 -0
  119. package/dist/layout/tabs/Tab.svelte.d.ts +4 -0
  120. package/dist/layout/tabs/TabContent.svelte +30 -0
  121. package/dist/layout/tabs/TabContent.svelte.d.ts +4 -0
  122. package/dist/layout/tabs/TabGroup.svelte +62 -0
  123. package/dist/layout/tabs/TabGroup.svelte.d.ts +4 -0
  124. package/dist/layout/tabs/tabs.d.ts +140 -0
  125. package/dist/layout/tabs/tabs.js +298 -0
  126. package/dist/modal/Modal.svelte +207 -0
  127. package/dist/modal/Modal.svelte.d.ts +4 -0
  128. package/dist/modal/modal.d.ts +211 -0
  129. package/dist/modal/modal.js +81 -0
  130. package/dist/sonner/sonner.svelte +13 -0
  131. package/dist/sonner/sonner.svelte.d.ts +4 -0
  132. package/dist/types/variants.d.ts +1 -0
  133. package/dist/types/variants.js +1 -0
  134. package/dist/utils/Portal.svelte +108 -0
  135. package/dist/utils/Portal.svelte.d.ts +8 -0
  136. package/dist/utils/dateUtils.d.ts +7 -0
  137. package/dist/utils/dateUtils.js +26 -0
  138. package/dist/variants.d.ts +30 -0
  139. package/dist/variants.js +36 -0
  140. package/package.json +39 -6
  141. package/dist/layout/Card.svelte +0 -179
  142. package/dist/layout/Card.svelte.d.ts +0 -208
  143. package/dist/layout/index.d.ts +0 -1
  144. package/dist/layout/index.js +0 -1
@@ -0,0 +1,181 @@
1
+ <script lang="ts">
2
+ import Badge from '../elements/badge/Badge.svelte';
3
+ import { Size } from '../variants.js';
4
+ import { cn } from '../helper/cls.js';
5
+ import type { TagsProps } from '../index.js';
6
+
7
+ let {
8
+ value = $bindable([]),
9
+ name,
10
+ label,
11
+ errors,
12
+ placeholder = 'Type and press enter to add tags...',
13
+ size = Size.BASE,
14
+ class: className = '',
15
+ suggestions = [],
16
+ onaddtag: onAddTag,
17
+ onremovetag: onRemoveTag
18
+ }: TagsProps = $props();
19
+
20
+ let inputValue = $state('');
21
+ let inputRef = $state<HTMLInputElement | null>(null);
22
+ let showSuggestions = $state(false);
23
+ let highlightedIndex = $state(-1);
24
+
25
+ const isUnselected = (suggestion: string) => !value.includes(suggestion);
26
+
27
+ const matchesInput = (suggestion: string) =>
28
+ !inputValue || suggestion.toLowerCase().includes(inputValue.toLowerCase());
29
+
30
+ const filteredSuggestions = $derived(
31
+ showSuggestions ? suggestions.filter(isUnselected).filter(matchesInput).slice(0, 5) : []
32
+ );
33
+
34
+ function handleKeydown(event: KeyboardEvent) {
35
+ if (event.key === 'Enter') {
36
+ event.preventDefault();
37
+ if (highlightedIndex >= 0 && highlightedIndex < filteredSuggestions.length) {
38
+ handleTagAddition(filteredSuggestions[highlightedIndex]);
39
+ } else {
40
+ const tag = inputValue.trim();
41
+ if (tag) handleTagAddition(tag);
42
+ }
43
+ return;
44
+ }
45
+
46
+ if (event.key === 'ArrowDown') {
47
+ event.preventDefault();
48
+ if (!showSuggestions) {
49
+ showSuggestions = true;
50
+ highlightedIndex = 0;
51
+ return;
52
+ }
53
+ highlightedIndex = Math.min(highlightedIndex + 1, filteredSuggestions.length - 1);
54
+ if (highlightedIndex === -1 && filteredSuggestions.length > 0) highlightedIndex = 0;
55
+ return;
56
+ }
57
+
58
+ if (event.key === 'ArrowUp') {
59
+ event.preventDefault();
60
+ highlightedIndex = Math.max(highlightedIndex - 1, -1);
61
+ return;
62
+ }
63
+
64
+ if (event.key === 'Escape') {
65
+ showSuggestions = false;
66
+ highlightedIndex = -1;
67
+ }
68
+ }
69
+
70
+ function handleTagAddition(tag: string) {
71
+ if (!value.includes(tag)) {
72
+ value = [...value, tag];
73
+ onAddTag?.(tag);
74
+ }
75
+ inputValue = '';
76
+ showSuggestions = false;
77
+ highlightedIndex = -1;
78
+ }
79
+
80
+ function handleTagRemoval(tag: string) {
81
+ value = value.filter((t) => t !== tag);
82
+ onRemoveTag?.(tag);
83
+ inputRef?.focus();
84
+ }
85
+
86
+ function handleFocusOut(event: FocusEvent) {
87
+ const target = event.currentTarget as HTMLElement;
88
+ if (!target.contains(event.relatedTarget as Node)) {
89
+ showSuggestions = false;
90
+ highlightedIndex = -1;
91
+ }
92
+ }
93
+
94
+ function handleFocusIn() {
95
+ showSuggestions = true;
96
+ }
97
+
98
+ function handleSuggestionHover(index: number) {
99
+ highlightedIndex = index;
100
+ }
101
+
102
+ function handleSuggestionSelect(suggestion: string) {
103
+ handleTagAddition(suggestion);
104
+ }
105
+
106
+ const containerClass = $derived(
107
+ cn(
108
+ 'relative flex flex-wrap gap-2 rounded-lg border bg-white shadow-sm px-3 py-2',
109
+ 'border-default-300 focus-within:border-primary-500 focus-within:ring-2 focus-within:ring-primary-500 focus-within:ring-offset-2',
110
+ {
111
+ 'border-red-300 focus-within:border-red-500 focus-within:ring-red-500': errors?.length
112
+ },
113
+ className
114
+ )
115
+ );
116
+
117
+ const suggestionClass = $derived(
118
+ cn(
119
+ 'absolute top-[calc(100%+8px)] right-0 left-0 z-50 max-h-[200px] overflow-auto rounded-lg border border-default-300 bg-white shadow-lg'
120
+ )
121
+ );
122
+
123
+ const suggestionItemClass = $derived((isHighlighted: boolean) =>
124
+ cn(
125
+ 'flex w-full cursor-pointer items-center px-3 py-2 text-sm transition-colors',
126
+ isHighlighted && 'bg-default-50'
127
+ )
128
+ );
129
+ </script>
130
+
131
+ <div class="space-y-1">
132
+ {#if label}
133
+ <label for={name} class="block text-sm font-medium text-default-700">{label}</label>
134
+ {/if}
135
+ <div class={containerClass} onfocusout={handleFocusOut}>
136
+ {#each value as tag}
137
+ <Badge {size} color="info" onclose={() => handleTagRemoval(tag)} class="shadow-xs">
138
+ {tag}
139
+ </Badge>
140
+ {/each}
141
+ <input
142
+ bind:this={inputRef}
143
+ bind:value={inputValue}
144
+ {name}
145
+ id={name}
146
+ {placeholder}
147
+ class={cn('min-w-[120px] flex-1 bg-transparent outline-none placeholder:text-default-400', {
148
+ 'text-sm': size === Size.SM,
149
+ 'text-base': size === Size.BASE,
150
+ 'text-lg': size === Size.LG
151
+ })}
152
+ type="text"
153
+ autocomplete="off"
154
+ onkeydown={handleKeydown}
155
+ onfocus={handleFocusIn}
156
+ />
157
+
158
+ {#if showSuggestions && filteredSuggestions.length > 0}
159
+ <div class={suggestionClass}>
160
+ {#each filteredSuggestions as suggestion, i}
161
+ <button
162
+ type="button"
163
+ class={suggestionItemClass(i === highlightedIndex)}
164
+ onmousedown={() => handleSuggestionSelect(suggestion)}
165
+ onmouseover={() => handleSuggestionHover(i)}
166
+ onfocus={() => handleSuggestionHover(i)}
167
+ tabindex="-1"
168
+ >
169
+ {suggestion}
170
+ </button>
171
+ {/each}
172
+ </div>
173
+ {/if}
174
+ </div>
175
+
176
+ {#if errors?.length}
177
+ {#each errors as error}
178
+ <p class="text-sm text-red-600">{error}</p>
179
+ {/each}
180
+ {/if}
181
+ </div>
@@ -0,0 +1,4 @@
1
+ import type { TagsProps } from '../index.js';
2
+ declare const Tags: import("svelte").Component<TagsProps, {}, "value">;
3
+ type Tags = ReturnType<typeof Tags>;
4
+ export default Tags;
@@ -0,0 +1,132 @@
1
+ <script lang="ts">
2
+ import { cn } from '../helper/cls.js';
3
+ import { Color, Size } from '../variants.js';
4
+ import type { ToggleProps } from '../index.js';
5
+
6
+ let {
7
+ name,
8
+ id = name,
9
+ label,
10
+ disabled = false,
11
+ class: className = '',
12
+ size = Size.BASE,
13
+ color = Color.PRIMARY,
14
+ value = $bindable(false),
15
+ errors = [],
16
+ offColor = 'bg-default-200',
17
+ onColor,
18
+ ...restProps
19
+ }: ToggleProps = $props();
20
+
21
+ const activeColor = $derived(
22
+ onColor ||
23
+ {
24
+ [Color.PRIMARY]: 'bg-primary-500',
25
+ [Color.SECONDARY]: 'bg-secondary-500',
26
+ [Color.SUCCESS]: 'bg-green-500',
27
+ [Color.DANGER]: 'bg-red-500',
28
+ [Color.WARNING]: 'bg-yellow-500',
29
+ [Color.INFO]: 'bg-blue-500',
30
+ [Color.DEFAULT]: 'bg-default-800'
31
+ }[color]
32
+ );
33
+
34
+ const toggleSize = $derived(
35
+ {
36
+ [Size.SM]: 'w-8 h-4',
37
+ [Size.BASE]: 'w-10 h-5',
38
+ [Size.LG]: 'w-12 h-6'
39
+ }[size]
40
+ );
41
+
42
+ const thumbSize = $derived(
43
+ {
44
+ [Size.SM]: 'h-3 w-3',
45
+ [Size.BASE]: 'h-4 w-4',
46
+ [Size.LG]: 'h-5 w-5'
47
+ }[size]
48
+ );
49
+
50
+ const thumbPosition = $derived(
51
+ {
52
+ [Size.SM]: value ? 'translate-x-4' : 'translate-x-0.5',
53
+ [Size.BASE]: value ? 'translate-x-5' : 'translate-x-0.5',
54
+ [Size.LG]: value ? 'translate-x-6' : 'translate-x-0.5'
55
+ }[size]
56
+ );
57
+
58
+ const toggleWrapperClasses = $derived(
59
+ cn(
60
+ 'relative inline-flex items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2',
61
+ toggleSize,
62
+ value ? activeColor : offColor,
63
+ {
64
+ 'opacity-50 cursor-not-allowed': disabled,
65
+ 'cursor-pointer': !disabled,
66
+ 'focus:ring-red-500': errors.length,
67
+ [`focus:ring-${color}-500`]: !errors.length
68
+ },
69
+ className
70
+ )
71
+ );
72
+
73
+ const thumbClasses = $derived(
74
+ cn(
75
+ 'inline-block transform rounded-full bg-white transition-transform',
76
+ thumbSize,
77
+ thumbPosition
78
+ )
79
+ );
80
+
81
+ const labelClasses = $derived(
82
+ cn('text-sm font-medium', {
83
+ 'text-default-700': !errors.length,
84
+ 'text-red-600': errors.length,
85
+ 'opacity-50': disabled
86
+ })
87
+ );
88
+
89
+ function handleKeyDown(event: KeyboardEvent) {
90
+ if (disabled) return;
91
+ if (event.key === 'Enter' || event.key === ' ') {
92
+ event.preventDefault();
93
+ value = !value;
94
+ }
95
+ }
96
+ </script>
97
+
98
+ <div class="flex items-center">
99
+ {#if label}
100
+ <label for={id} class={cn('mr-3', labelClasses)}>{label}</label>
101
+ {/if}
102
+ <button
103
+ type="button"
104
+ role="switch"
105
+ aria-checked={value}
106
+ {id}
107
+ {name}
108
+ {disabled}
109
+ aria-invalid={!!errors.length}
110
+ aria-describedby={errors.length ? `${name}-errors` : undefined}
111
+ class={toggleWrapperClasses}
112
+ onclick={() => {
113
+ if (!disabled) value = !value;
114
+ }}
115
+ onkeydown={handleKeyDown}
116
+ tabindex={disabled ? -1 : 0}
117
+ {...restProps}
118
+ >
119
+ <span class={thumbClasses} aria-hidden="true"></span>
120
+ <input type="checkbox" class="hidden" {name} bind:checked={value} />
121
+ </button>
122
+ </div>
123
+
124
+ {#if errors.length}
125
+ <div id="{name}-errors" class="mt-1">
126
+ {#each errors as error (error)}
127
+ <p class="text-sm text-red-600" role="alert">
128
+ {error}
129
+ </p>
130
+ {/each}
131
+ </div>
132
+ {/if}
@@ -0,0 +1,4 @@
1
+ import type { ToggleProps } from '../index.js';
2
+ declare const Toggle: import("svelte").Component<ToggleProps, {}, "value">;
3
+ type Toggle = ReturnType<typeof Toggle>;
4
+ export default Toggle;
@@ -0,0 +1,143 @@
1
+ import { Size } from '../variants.js';
2
+ export declare const slider: import("tailwind-variants").TVReturnType<{
3
+ size: {
4
+ [Size.SM]: {
5
+ track: string;
6
+ thumb: string;
7
+ mark: string;
8
+ label: string;
9
+ value: string;
10
+ };
11
+ [Size.BASE]: {
12
+ track: string;
13
+ thumb: string;
14
+ mark: string;
15
+ label: string;
16
+ value: string;
17
+ };
18
+ [Size.LG]: {
19
+ track: string;
20
+ thumb: string;
21
+ mark: string;
22
+ label: string;
23
+ value: string;
24
+ };
25
+ };
26
+ disabled: {
27
+ true: {
28
+ base: string;
29
+ thumb: string;
30
+ };
31
+ };
32
+ hasError: {
33
+ true: {
34
+ track: string;
35
+ range: string;
36
+ thumb: string;
37
+ label: string;
38
+ value: string;
39
+ };
40
+ };
41
+ }, {
42
+ base: string;
43
+ track: string;
44
+ range: string;
45
+ thumb: string[];
46
+ mark: string;
47
+ label: string;
48
+ value: string;
49
+ }, undefined, {
50
+ size: {
51
+ [Size.SM]: {
52
+ track: string;
53
+ thumb: string;
54
+ mark: string;
55
+ label: string;
56
+ value: string;
57
+ };
58
+ [Size.BASE]: {
59
+ track: string;
60
+ thumb: string;
61
+ mark: string;
62
+ label: string;
63
+ value: string;
64
+ };
65
+ [Size.LG]: {
66
+ track: string;
67
+ thumb: string;
68
+ mark: string;
69
+ label: string;
70
+ value: string;
71
+ };
72
+ };
73
+ disabled: {
74
+ true: {
75
+ base: string;
76
+ thumb: string;
77
+ };
78
+ };
79
+ hasError: {
80
+ true: {
81
+ track: string;
82
+ range: string;
83
+ thumb: string;
84
+ label: string;
85
+ value: string;
86
+ };
87
+ };
88
+ }, {
89
+ base: string;
90
+ track: string;
91
+ range: string;
92
+ thumb: string[];
93
+ mark: string;
94
+ label: string;
95
+ value: string;
96
+ }, import("tailwind-variants").TVReturnType<{
97
+ size: {
98
+ [Size.SM]: {
99
+ track: string;
100
+ thumb: string;
101
+ mark: string;
102
+ label: string;
103
+ value: string;
104
+ };
105
+ [Size.BASE]: {
106
+ track: string;
107
+ thumb: string;
108
+ mark: string;
109
+ label: string;
110
+ value: string;
111
+ };
112
+ [Size.LG]: {
113
+ track: string;
114
+ thumb: string;
115
+ mark: string;
116
+ label: string;
117
+ value: string;
118
+ };
119
+ };
120
+ disabled: {
121
+ true: {
122
+ base: string;
123
+ thumb: string;
124
+ };
125
+ };
126
+ hasError: {
127
+ true: {
128
+ track: string;
129
+ range: string;
130
+ thumb: string;
131
+ label: string;
132
+ value: string;
133
+ };
134
+ };
135
+ }, {
136
+ base: string;
137
+ track: string;
138
+ range: string;
139
+ thumb: string[];
140
+ mark: string;
141
+ label: string;
142
+ value: string;
143
+ }, undefined, unknown, unknown, undefined>>;
@@ -0,0 +1,62 @@
1
+ import { tv } from 'tailwind-variants';
2
+ import { Color, Size } from '../variants.js';
3
+ export const slider = tv({
4
+ slots: {
5
+ base: 'relative w-full',
6
+ track: 'absolute h-2 w-full rounded-full bg-default-200 cursor-pointer',
7
+ range: 'absolute h-full rounded-full bg-primary-500',
8
+ thumb: [
9
+ 'absolute top-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-white border-2 border-primary-500',
10
+ 'focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2',
11
+ 'hover:scale-110 transition-transform cursor-pointer'
12
+ ],
13
+ mark: 'absolute text-sm text-default-500 -translate-x-1/2',
14
+ label: 'mb-2 block text-sm font-medium text-default-700',
15
+ value: 'mt-1 text-sm text-default-500'
16
+ },
17
+ variants: {
18
+ size: {
19
+ [Size.SM]: {
20
+ track: 'h-1',
21
+ thumb: 'w-3 h-3',
22
+ mark: 'text-xs top-4',
23
+ label: 'text-xs',
24
+ value: 'text-xs'
25
+ },
26
+ [Size.BASE]: {
27
+ track: 'h-2',
28
+ thumb: 'w-4 h-4',
29
+ mark: 'text-sm top-6',
30
+ label: 'text-sm',
31
+ value: 'text-sm'
32
+ },
33
+ [Size.LG]: {
34
+ track: 'h-3',
35
+ thumb: 'w-5 h-5',
36
+ mark: 'text-base top-7',
37
+ label: 'text-base',
38
+ value: 'text-base'
39
+ }
40
+ },
41
+ disabled: {
42
+ true: {
43
+ base: 'opacity-50 cursor-not-allowed',
44
+ thumb: 'cursor-not-allowed hover:scale-100 active:scale-100'
45
+ }
46
+ },
47
+ hasError: {
48
+ true: {
49
+ track: 'bg-danger-200',
50
+ range: 'bg-danger-500',
51
+ thumb: 'border-danger-500 focus:ring-danger-500',
52
+ label: 'text-danger-600',
53
+ value: 'text-danger-600'
54
+ }
55
+ }
56
+ },
57
+ defaultVariants: {
58
+ size: Size.BASE,
59
+ disabled: false,
60
+ hasError: false
61
+ }
62
+ });
@@ -0,0 +1,73 @@
1
+ <script lang="ts">
2
+ import { cn } from '../helper/cls.js';
3
+ import { breadcrumbs } from './breadcrumbs.js';
4
+ import type { BreadcrumbsProps } from '../index.js';
5
+
6
+ let {
7
+ items = [],
8
+ size = 'sm',
9
+ color = 'default',
10
+ weight = 'medium',
11
+ icon: Icon,
12
+ class: className = '',
13
+ listclass: listClassName = '',
14
+ itemclass: itemClassName = '',
15
+ separatorclass: separatorClassName = '',
16
+ wrapperclass: wrapperClassName = ''
17
+ }: BreadcrumbsProps = $props();
18
+
19
+ // Get the slots from the breadcrumbs
20
+ const { base, list, item, separator, wrapper } = $derived(
21
+ breadcrumbs({
22
+ size,
23
+ weight,
24
+ color
25
+ })
26
+ );
27
+
28
+ const baseClass = $derived(cn(base(), className));
29
+ const listClass = $derived(cn(list(), listClassName));
30
+ const itemClasses = $derived(cn(item(), itemClassName));
31
+ const separatorClasses = $derived(cn(separator(), separatorClassName));
32
+ const wrapperClasses = $derived(cn(wrapper(), wrapperClassName));
33
+ </script>
34
+
35
+ <nav class={baseClass} aria-label="Breadcrumb">
36
+ <ol role="list" class={listClass}>
37
+ {#each items as breadcrumbItem, index (index)}
38
+ <li>
39
+ <div class={wrapperClasses}>
40
+ {#if index > 0}
41
+ <span class={separatorClasses}>
42
+ {#if Icon}
43
+ <Icon />
44
+ {:else}
45
+ <svg
46
+ xmlns="http://www.w3.org/2000/svg"
47
+ width="0.8em"
48
+ height="0.8em"
49
+ viewBox="0 0 16 16"
50
+ >
51
+ <path
52
+ fill="currentColor"
53
+ d="M5.74 3.2a.75.75 0 0 0-.04 1.06L9.227 8L5.7 11.74a.75.75 0 1 0 1.1 1.02l4-4.25a.75.75 0 0 0 0-1.02l-4-4.25a.75.75 0 0 0-1.06-.04"
54
+ />
55
+ </svg>
56
+ {/if}
57
+ </span>
58
+ {/if}
59
+ <a
60
+ href={breadcrumbItem.href}
61
+ class={cn(
62
+ itemClasses,
63
+ breadcrumbItem.current ? breadcrumbs({ active: true }).item() : ''
64
+ )}
65
+ aria-current={breadcrumbItem.current ? 'page' : undefined}
66
+ >
67
+ {breadcrumbItem.label}
68
+ </a>
69
+ </div>
70
+ </li>
71
+ {/each}
72
+ </ol>
73
+ </nav>
@@ -0,0 +1,4 @@
1
+ import type { BreadcrumbsProps } from '../index.js';
2
+ declare const Breadcrumbs: import("svelte").Component<BreadcrumbsProps, {}, "">;
3
+ type Breadcrumbs = ReturnType<typeof Breadcrumbs>;
4
+ export default Breadcrumbs;
@@ -0,0 +1,68 @@
1
+ <script lang="ts">
2
+ import { cn } from '../helper/cls.js';
3
+ import type { PageHeaderProps } from '../index.js';
4
+ import Breadcrumbs from './Breadcrumbs.svelte';
5
+
6
+ let {
7
+ title,
8
+ subtitle,
9
+ breadcrumbs = [],
10
+ children,
11
+ class: className = '',
12
+ titleclass: titleClassName = '',
13
+ layout = 'vertical'
14
+ }: PageHeaderProps = $props();
15
+
16
+ const defaultTitleClasses =
17
+ 'font-bold text-default-900 sm:tracking-tight sm:truncate text-2xl/7 sm:text-3xl';
18
+
19
+ const hasBreadcrumbs = $derived(breadcrumbs && breadcrumbs.length > 0);
20
+ const titleClasses = $derived(cn(defaultTitleClasses, titleClassName));
21
+ </script>
22
+
23
+ <div class="pb-4">
24
+ {#if layout === 'horizontal'}
25
+ <div
26
+ class="flex flex-col space-y-3 md:flex-row md:items-start md:justify-between md:space-y-0 {className}"
27
+ >
28
+ <!-- Title and subtitle grouped together as one unit -->
29
+ <div class="min-w-0 flex-1 gap-4">
30
+ {#if hasBreadcrumbs}
31
+ <Breadcrumbs items={breadcrumbs} />
32
+ {/if}
33
+ <h2 class={titleClasses}>{title}</h2>
34
+ {#if subtitle}
35
+ <p class="text-default-500 mt-2 text-sm">{subtitle}</p>
36
+ {/if}
37
+ </div>
38
+
39
+ <!-- Actions area - responsive positioning -->
40
+ {#if children}
41
+ <div class="flex-shrink-0 md:ml-6">
42
+ {@render children()}
43
+ </div>
44
+ {/if}
45
+ </div>
46
+ {:else}
47
+ <!-- Vertical layout - title/subtitle unit first, children unit below -->
48
+ <div class={className}>
49
+ <!-- Title and subtitle grouped together -->
50
+ <div class="min-w-0 gap-4">
51
+ {#if hasBreadcrumbs}
52
+ <Breadcrumbs items={breadcrumbs} />
53
+ {/if}
54
+ <h2 class={titleClasses}>{title}</h2>
55
+ {#if subtitle}
56
+ <p class="text-default-500 mt-2 text-sm">{subtitle}</p>
57
+ {/if}
58
+ </div>
59
+
60
+ <!-- Children as separate unit below -->
61
+ {#if children}
62
+ <div class="mt-4">
63
+ {@render children()}
64
+ </div>
65
+ {/if}
66
+ </div>
67
+ {/if}
68
+ </div>
@@ -0,0 +1,4 @@
1
+ import type { PageHeaderProps } from '../index.js';
2
+ declare const PageHeader: import("svelte").Component<PageHeaderProps, {}, "">;
3
+ type PageHeader = ReturnType<typeof PageHeader>;
4
+ export default PageHeader;