ui-svelte 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +118 -0
  3. package/dist/charts/ArcChart.svelte +320 -0
  4. package/dist/charts/ArcChart.svelte.d.ts +26 -0
  5. package/dist/charts/AreaChart.svelte +495 -0
  6. package/dist/charts/AreaChart.svelte.d.ts +32 -0
  7. package/dist/charts/BarChart.svelte +504 -0
  8. package/dist/charts/BarChart.svelte.d.ts +38 -0
  9. package/dist/charts/Candlestick.svelte +527 -0
  10. package/dist/charts/Candlestick.svelte.d.ts +38 -0
  11. package/dist/charts/LineChart.svelte +365 -0
  12. package/dist/charts/LineChart.svelte.d.ts +36 -0
  13. package/dist/charts/PieChart.svelte +311 -0
  14. package/dist/charts/PieChart.svelte.d.ts +28 -0
  15. package/dist/charts/css/arc-chart.css +237 -0
  16. package/dist/charts/css/area-chart.css +289 -0
  17. package/dist/charts/css/bar-chart.css +167 -0
  18. package/dist/charts/css/candlestick.css +197 -0
  19. package/dist/charts/css/line-chart.css +202 -0
  20. package/dist/charts/css/pie-chart.css +199 -0
  21. package/dist/control/Audio.svelte +212 -0
  22. package/dist/control/Audio.svelte.d.ts +8 -0
  23. package/dist/control/Button.svelte +116 -0
  24. package/dist/control/Button.svelte.d.ts +22 -0
  25. package/dist/control/IconButton.svelte +104 -0
  26. package/dist/control/IconButton.svelte.d.ts +17 -0
  27. package/dist/control/Record.svelte +430 -0
  28. package/dist/control/Record.svelte.d.ts +11 -0
  29. package/dist/control/ToggleTheme.svelte +21 -0
  30. package/dist/control/ToggleTheme.svelte.d.ts +8 -0
  31. package/dist/control/Video.svelte +222 -0
  32. package/dist/control/Video.svelte.d.ts +10 -0
  33. package/dist/control/css/btn.css +206 -0
  34. package/dist/control/css/media.css +78 -0
  35. package/dist/control/css/video.css +58 -0
  36. package/dist/css/animations.css +27 -0
  37. package/dist/css/base.css +192 -0
  38. package/dist/css/utilities.css +136 -0
  39. package/dist/display/Accordion.svelte +98 -0
  40. package/dist/display/Accordion.svelte.d.ts +20 -0
  41. package/dist/display/Alert.svelte +65 -0
  42. package/dist/display/Alert.svelte.d.ts +15 -0
  43. package/dist/display/Avatar.svelte +80 -0
  44. package/dist/display/Avatar.svelte.d.ts +13 -0
  45. package/dist/display/Badge.svelte +46 -0
  46. package/dist/display/Badge.svelte.d.ts +11 -0
  47. package/dist/display/Card.svelte +94 -0
  48. package/dist/display/Card.svelte.d.ts +21 -0
  49. package/dist/display/Carousel.svelte +359 -0
  50. package/dist/display/Carousel.svelte.d.ts +25 -0
  51. package/dist/display/ChatBox.svelte +249 -0
  52. package/dist/display/ChatBox.svelte.d.ts +18 -0
  53. package/dist/display/Chip.svelte +67 -0
  54. package/dist/display/Chip.svelte.d.ts +17 -0
  55. package/dist/display/Code.svelte +56 -0
  56. package/dist/display/Code.svelte.d.ts +9 -0
  57. package/dist/display/Collapsible.svelte +71 -0
  58. package/dist/display/Collapsible.svelte.d.ts +15 -0
  59. package/dist/display/Divider.svelte +32 -0
  60. package/dist/display/Divider.svelte.d.ts +10 -0
  61. package/dist/display/Empty.svelte +462 -0
  62. package/dist/display/Empty.svelte.d.ts +11 -0
  63. package/dist/display/Icon.svelte +20 -0
  64. package/dist/display/Icon.svelte.d.ts +11 -0
  65. package/dist/display/Item.svelte +119 -0
  66. package/dist/display/Item.svelte.d.ts +24 -0
  67. package/dist/display/Loading.svelte +8 -0
  68. package/dist/display/Loading.svelte.d.ts +26 -0
  69. package/dist/display/Marquee.svelte +164 -0
  70. package/dist/display/Marquee.svelte.d.ts +21 -0
  71. package/dist/display/Section.svelte +63 -0
  72. package/dist/display/Section.svelte.d.ts +16 -0
  73. package/dist/display/Table.svelte +407 -0
  74. package/dist/display/Table.svelte.d.ts +32 -0
  75. package/dist/display/TypeWriter.svelte +23 -0
  76. package/dist/display/TypeWriter.svelte.d.ts +11 -0
  77. package/dist/display/User.svelte +0 -0
  78. package/dist/display/User.svelte.d.ts +26 -0
  79. package/dist/display/css/accordion.css +98 -0
  80. package/dist/display/css/alert.css +51 -0
  81. package/dist/display/css/avatar.css +158 -0
  82. package/dist/display/css/badge.css +47 -0
  83. package/dist/display/css/card.css +231 -0
  84. package/dist/display/css/carousel.css +156 -0
  85. package/dist/display/css/chat-box.css +188 -0
  86. package/dist/display/css/chip.css +91 -0
  87. package/dist/display/css/code.css +19 -0
  88. package/dist/display/css/collapsible.css +86 -0
  89. package/dist/display/css/divider.css +54 -0
  90. package/dist/display/css/empty.css +8 -0
  91. package/dist/display/css/item.css +149 -0
  92. package/dist/display/css/listbox.css +24 -0
  93. package/dist/display/css/marquee.css +138 -0
  94. package/dist/display/css/section.css +85 -0
  95. package/dist/display/css/table.css +361 -0
  96. package/dist/form/Checkbox.svelte +45 -0
  97. package/dist/form/Checkbox.svelte.d.ts +13 -0
  98. package/dist/form/ComboBox.svelte +448 -0
  99. package/dist/form/ComboBox.svelte.d.ts +29 -0
  100. package/dist/form/CsvField.svelte +389 -0
  101. package/dist/form/CsvField.svelte.d.ts +21 -0
  102. package/dist/form/DateField.svelte +292 -0
  103. package/dist/form/DateField.svelte.d.ts +18 -0
  104. package/dist/form/Dropzone.svelte +196 -0
  105. package/dist/form/Dropzone.svelte.d.ts +30 -0
  106. package/dist/form/ImageCropper.svelte +254 -0
  107. package/dist/form/ImageCropper.svelte.d.ts +14 -0
  108. package/dist/form/PasswordField.svelte +170 -0
  109. package/dist/form/PasswordField.svelte.d.ts +28 -0
  110. package/dist/form/PhoneField.svelte +485 -0
  111. package/dist/form/PhoneField.svelte.d.ts +25 -0
  112. package/dist/form/PinField.svelte +139 -0
  113. package/dist/form/PinField.svelte.d.ts +17 -0
  114. package/dist/form/RadioGroup.svelte +70 -0
  115. package/dist/form/RadioGroup.svelte.d.ts +19 -0
  116. package/dist/form/Select.svelte +350 -0
  117. package/dist/form/Select.svelte.d.ts +26 -0
  118. package/dist/form/Slider.svelte +60 -0
  119. package/dist/form/Slider.svelte.d.ts +15 -0
  120. package/dist/form/TextField.svelte +154 -0
  121. package/dist/form/TextField.svelte.d.ts +31 -0
  122. package/dist/form/Textarea.svelte +137 -0
  123. package/dist/form/Textarea.svelte.d.ts +27 -0
  124. package/dist/form/Toggle.svelte +45 -0
  125. package/dist/form/Toggle.svelte.d.ts +13 -0
  126. package/dist/form/css/checkbox.css +46 -0
  127. package/dist/form/css/combo-box.css +69 -0
  128. package/dist/form/css/control.css +177 -0
  129. package/dist/form/css/csv-field.css +0 -0
  130. package/dist/form/css/date.css +56 -0
  131. package/dist/form/css/dropzone.css +133 -0
  132. package/dist/form/css/field.css +17 -0
  133. package/dist/form/css/image-cropper.css +155 -0
  134. package/dist/form/css/password.css +35 -0
  135. package/dist/form/css/radio-group.css +57 -0
  136. package/dist/form/css/select.css +18 -0
  137. package/dist/form/css/slider.css +80 -0
  138. package/dist/form/css/textarea.css +130 -0
  139. package/dist/form/css/toggle.css +27 -0
  140. package/dist/form/js/countries.d.ts +13 -0
  141. package/dist/form/js/countries.js +307 -0
  142. package/dist/form/js/phone-examples.d.ts +248 -0
  143. package/dist/form/js/phone-examples.js +247 -0
  144. package/dist/hooks/use-auth.svelte.d.ts +11 -0
  145. package/dist/hooks/use-auth.svelte.js +59 -0
  146. package/dist/hooks/use-chat.svelte.d.ts +40 -0
  147. package/dist/hooks/use-chat.svelte.js +265 -0
  148. package/dist/hooks/use-clipboard.svelte.d.ts +9 -0
  149. package/dist/hooks/use-clipboard.svelte.js +52 -0
  150. package/dist/hooks/use-fetch.svelte.d.ts +11 -0
  151. package/dist/hooks/use-fetch.svelte.js +38 -0
  152. package/dist/hooks/use-form.svelte.d.ts +31 -0
  153. package/dist/hooks/use-form.svelte.js +110 -0
  154. package/dist/hooks/use-localstorage.svelte.d.ts +3 -0
  155. package/dist/hooks/use-localstorage.svelte.js +26 -0
  156. package/dist/hooks/use-scroll.svelte.d.ts +6 -0
  157. package/dist/hooks/use-scroll.svelte.js +34 -0
  158. package/dist/hooks/use-search.svelte.d.ts +49 -0
  159. package/dist/hooks/use-search.svelte.js +229 -0
  160. package/dist/hooks/use-table.svelte.d.ts +85 -0
  161. package/dist/hooks/use-table.svelte.js +362 -0
  162. package/dist/hooks/use-websocket.svelte.d.ts +18 -0
  163. package/dist/hooks/use-websocket.svelte.js +79 -0
  164. package/dist/icons/index.d.ts +132 -0
  165. package/dist/icons/index.js +132 -0
  166. package/dist/index.css +115 -0
  167. package/dist/index.d.ts +76 -0
  168. package/dist/index.js +76 -0
  169. package/dist/layout/AppBar.svelte +94 -0
  170. package/dist/layout/AppBar.svelte.d.ts +17 -0
  171. package/dist/layout/Footer.svelte +94 -0
  172. package/dist/layout/Footer.svelte.d.ts +17 -0
  173. package/dist/layout/FooterLinks.svelte +28 -0
  174. package/dist/layout/FooterLinks.svelte.d.ts +11 -0
  175. package/dist/layout/Provider.svelte +52 -0
  176. package/dist/layout/Provider.svelte.d.ts +10 -0
  177. package/dist/layout/Scaffold.svelte +46 -0
  178. package/dist/layout/Scaffold.svelte.d.ts +15 -0
  179. package/dist/layout/Sidebar.svelte +40 -0
  180. package/dist/layout/Sidebar.svelte.d.ts +13 -0
  181. package/dist/layout/css/app-bar.css +35 -0
  182. package/dist/layout/css/bottom-bar.css +12 -0
  183. package/dist/layout/css/footer-links.css +17 -0
  184. package/dist/layout/css/footer.css +35 -0
  185. package/dist/layout/css/scaffold.css +15 -0
  186. package/dist/layout/css/sidebar.css +17 -0
  187. package/dist/navigation/BottomNav.svelte +0 -0
  188. package/dist/navigation/BottomNav.svelte.d.ts +26 -0
  189. package/dist/navigation/NavMenu.svelte +254 -0
  190. package/dist/navigation/SideNav.svelte +249 -0
  191. package/dist/navigation/Tabs.svelte +79 -0
  192. package/dist/navigation/Tabs.svelte.d.ts +19 -0
  193. package/dist/navigation/css/bottom-nav.css +0 -0
  194. package/dist/navigation/css/nav-menu.css +168 -0
  195. package/dist/navigation/css/side-nav.css +244 -0
  196. package/dist/navigation/css/tabs.css +118 -0
  197. package/dist/overlay/AlertDialog.svelte +0 -0
  198. package/dist/overlay/AlertDialog.svelte.d.ts +26 -0
  199. package/dist/overlay/Command.svelte +0 -0
  200. package/dist/overlay/Command.svelte.d.ts +26 -0
  201. package/dist/overlay/Drawer.svelte +129 -0
  202. package/dist/overlay/Drawer.svelte.d.ts +20 -0
  203. package/dist/overlay/Dropdown.svelte +140 -0
  204. package/dist/overlay/Modal.svelte +102 -0
  205. package/dist/overlay/Modal.svelte.d.ts +19 -0
  206. package/dist/overlay/PopoverStack.svelte +0 -0
  207. package/dist/overlay/PopoverStack.svelte.d.ts +26 -0
  208. package/dist/overlay/Toast.svelte +83 -0
  209. package/dist/overlay/Toast.svelte.d.ts +9 -0
  210. package/dist/overlay/Tooltip.svelte +140 -0
  211. package/dist/overlay/Tooltip.svelte.d.ts +12 -0
  212. package/dist/overlay/css/drawer.css +75 -0
  213. package/dist/overlay/css/dropdown.css +24 -0
  214. package/dist/overlay/css/hovercard.css +11 -0
  215. package/dist/overlay/css/modal.css +51 -0
  216. package/dist/overlay/css/toast.css +80 -0
  217. package/dist/overlay/css/tooltip.css +89 -0
  218. package/dist/stores/i18n.svelte.d.ts +16 -0
  219. package/dist/stores/i18n.svelte.js +137 -0
  220. package/dist/stores/theme.svelte.d.ts +5 -0
  221. package/dist/stores/theme.svelte.js +55 -0
  222. package/dist/stores/toast.svelte.d.ts +19 -0
  223. package/dist/stores/toast.svelte.js +38 -0
  224. package/dist/types.d.ts +75 -0
  225. package/dist/types.js +1 -0
  226. package/dist/utils/charts.d.ts +27 -0
  227. package/dist/utils/charts.js +140 -0
  228. package/dist/utils/class-names.d.ts +1 -0
  229. package/dist/utils/class-names.js +3 -0
  230. package/dist/utils/click-outside.d.ts +3 -0
  231. package/dist/utils/click-outside.js +9 -0
  232. package/dist/utils/popover.d.ts +3 -0
  233. package/dist/utils/popover.js +17 -0
  234. package/dist/utils/ulid.d.ts +1 -0
  235. package/dist/utils/ulid.js +22 -0
  236. package/dist/utils/validate-schema.d.ts +2 -0
  237. package/dist/utils/validate-schema.js +97 -0
  238. package/package.json +69 -0
@@ -0,0 +1,89 @@
1
+ @layer components {
2
+ .tooltip {
3
+ @apply relative w-fit;
4
+ }
5
+
6
+ .tooltip-popover {
7
+ @apply flex items-center gap-2 px-3 py-2;
8
+ @apply rounded-ui text-sm;
9
+ @apply invisible opacity-0 transition-opacity duration-300 ease-in-out;
10
+ @apply shadow shadow-muted;
11
+ @apply whitespace-nowrap;
12
+ position: fixed;
13
+ z-index: 9999;
14
+ pointer-events: none;
15
+ }
16
+
17
+ .tooltip-popover.is-active {
18
+ @apply visible opacity-100;
19
+ }
20
+
21
+ .tooltip-popover.is-primary {
22
+ @apply bg-on-primary text-primary;
23
+ }
24
+
25
+ .tooltip-popover.is-solid.is-primary {
26
+ @apply bg-primary text-on-primary;
27
+ }
28
+
29
+ .tooltip-popover.is-secondary {
30
+ @apply bg-on-secondary text-secondary;
31
+ }
32
+
33
+ .tooltip-popover.is-solid.is-secondary {
34
+ @apply bg-secondary text-on-secondary;
35
+ }
36
+
37
+ .tooltip-popover.is-muted {
38
+ @apply bg-muted text-on-muted;
39
+ }
40
+
41
+ .tooltip-popover.is-solid.is-muted {
42
+ @apply bg-on-muted text-muted;
43
+ }
44
+
45
+ .tooltip-arrow {
46
+ @apply absolute w-2 h-2 rotate-45;
47
+ position: absolute;
48
+ }
49
+
50
+ .tooltip-arrow.is-primary {
51
+ @apply bg-on-primary;
52
+ }
53
+
54
+ .tooltip-arrow.is-solid.is-primary {
55
+ @apply bg-primary;
56
+ }
57
+
58
+ .tooltip-arrow.is-secondary {
59
+ @apply bg-on-secondary;
60
+ }
61
+
62
+ .tooltip-arrow.is-solid.is-secondary {
63
+ @apply bg-secondary;
64
+ }
65
+
66
+ .tooltip-arrow.is-muted {
67
+ @apply bg-muted;
68
+ }
69
+
70
+ .tooltip-arrow.is-solid.is-muted {
71
+ @apply bg-on-muted;
72
+ }
73
+
74
+ .tooltip-popover.position-top .tooltip-arrow {
75
+ @apply -bottom-1 left-1/2 -translate-x-1/2;
76
+ }
77
+
78
+ .tooltip-popover.position-bottom .tooltip-arrow {
79
+ @apply -top-1 left-1/2 -translate-x-1/2;
80
+ }
81
+
82
+ .tooltip-popover.position-start .tooltip-arrow {
83
+ @apply -right-1 top-1/2 -translate-y-1/2;
84
+ }
85
+
86
+ .tooltip-popover.position-end .tooltip-arrow {
87
+ @apply -left-1 top-1/2 -translate-y-1/2;
88
+ }
89
+ }
@@ -0,0 +1,16 @@
1
+ export declare const initLanguage: (options?: {}) => Promise<void>;
2
+ export declare const setLanguage: (lang: string) => Promise<void>;
3
+ export declare const t: (key: string, params?: Record<string, any>) => string;
4
+ export declare const plural: (key: string, count: number, params?: Record<string, any>) => string;
5
+ export declare const formatDate: (date: Date | string | number, options?: Intl.DateTimeFormatOptions) => string;
6
+ export declare const formatNumber: (number: number, options?: Intl.NumberFormatOptions) => string;
7
+ export declare const formatCurrency: (amount: number, currency?: string, options?: Intl.NumberFormatOptions) => string;
8
+ export declare const getWeekdays: (format?: "short" | "long" | "narrow") => string[];
9
+ export declare const i18n: () => {
10
+ readonly language: string;
11
+ readonly translations: {};
12
+ readonly isLoading: boolean;
13
+ readonly availableLanguages: string[];
14
+ setLanguage: (lang: string) => Promise<void>;
15
+ t: (key: string, params?: Record<string, any>) => string;
16
+ };
@@ -0,0 +1,137 @@
1
+ import { browser } from '$app/environment';
2
+ let config = {
3
+ defaultLanguage: 'en',
4
+ availableLanguages: ['en']
5
+ };
6
+ let currentLanguage = $state(config.defaultLanguage);
7
+ let translations = $state({});
8
+ let isLoading = $state(false);
9
+ let isInitialized = $state(false);
10
+ export const initLanguage = async (options = {}) => {
11
+ config = {
12
+ defaultLanguage: 'en',
13
+ availableLanguages: ['en', 'es', 'fr'],
14
+ ...options
15
+ };
16
+ if (isInitialized) {
17
+ return;
18
+ }
19
+ let targetLanguage = config.defaultLanguage;
20
+ if (browser) {
21
+ const storedLang = localStorage.getItem('language');
22
+ if (storedLang && config.availableLanguages.includes(storedLang)) {
23
+ targetLanguage = storedLang;
24
+ }
25
+ else {
26
+ const browserLang = navigator.language.split('-')[0];
27
+ if (config.availableLanguages.includes(browserLang)) {
28
+ targetLanguage = browserLang;
29
+ }
30
+ }
31
+ }
32
+ await setLanguage(targetLanguage);
33
+ isInitialized = true;
34
+ };
35
+ export const setLanguage = async (lang) => {
36
+ if (!config.availableLanguages.includes(lang)) {
37
+ console.warn(`Idioma '${lang}' no disponible. Usando: ${config.defaultLanguage}`);
38
+ lang = config.defaultLanguage;
39
+ }
40
+ if (currentLanguage === lang && Object.keys(translations).length > 0) {
41
+ return;
42
+ }
43
+ isLoading = true;
44
+ try {
45
+ const module = await import(`$lib/locales/${lang}.ts`);
46
+ translations = module.default;
47
+ currentLanguage = lang;
48
+ if (browser) {
49
+ localStorage.setItem('language', lang);
50
+ document.documentElement.lang = lang;
51
+ }
52
+ }
53
+ catch (error) {
54
+ console.error(`Error cargando idioma '${lang}':`, error);
55
+ if (lang !== config.defaultLanguage) {
56
+ await setLanguage(config.defaultLanguage);
57
+ return;
58
+ }
59
+ }
60
+ finally {
61
+ isLoading = false;
62
+ }
63
+ };
64
+ export const t = (key, params = {}) => {
65
+ if (!translations || Object.keys(translations).length === 0) {
66
+ return '';
67
+ }
68
+ const translation = getNestedTranslation(translations, key);
69
+ if (!translation) {
70
+ return key;
71
+ }
72
+ return interpolate(translation, params);
73
+ };
74
+ export const plural = (key, count, params = {}) => {
75
+ const pluralKey = count === 1 ? `${key}.singular` : `${key}.plural`;
76
+ return t(pluralKey, { ...params, count });
77
+ };
78
+ export const formatDate = (date, options = {}) => {
79
+ return new Intl.DateTimeFormat(currentLanguage, options).format(new Date(date));
80
+ };
81
+ export const formatNumber = (number, options = {}) => {
82
+ return new Intl.NumberFormat(currentLanguage, options).format(number);
83
+ };
84
+ export const formatCurrency = (amount, currency = 'USD', options = {}) => {
85
+ return new Intl.NumberFormat(currentLanguage, {
86
+ style: 'currency',
87
+ currency,
88
+ ...options
89
+ }).format(amount);
90
+ };
91
+ export const getWeekdays = (format = 'short') => {
92
+ const weekdays = [];
93
+ for (let i = 0; i < 7; i++) {
94
+ const date = new Date(2024, 0, i);
95
+ const weekday = new Intl.DateTimeFormat(currentLanguage, {
96
+ weekday: format
97
+ }).format(date);
98
+ weekdays.push(weekday);
99
+ }
100
+ return weekdays;
101
+ };
102
+ export const i18n = () => {
103
+ return {
104
+ get language() {
105
+ return currentLanguage;
106
+ },
107
+ get translations() {
108
+ return translations;
109
+ },
110
+ get isLoading() {
111
+ return isLoading;
112
+ },
113
+ get availableLanguages() {
114
+ return config.availableLanguages;
115
+ },
116
+ setLanguage,
117
+ t
118
+ };
119
+ };
120
+ const getNestedTranslation = (obj, key) => {
121
+ const keys = key.split('.');
122
+ let current = obj;
123
+ for (const k of keys) {
124
+ if (current && typeof current === 'object') {
125
+ current = current[k];
126
+ }
127
+ else {
128
+ return undefined;
129
+ }
130
+ }
131
+ return typeof current === 'string' ? current : undefined;
132
+ };
133
+ const interpolate = (text, params) => {
134
+ return text.replace(/\{\{(\w+)\}\}/g, (match, param) => {
135
+ return params[param] !== undefined ? params[param] : match;
136
+ });
137
+ };
@@ -0,0 +1,5 @@
1
+ export declare const theme: {
2
+ readonly state: "dark" | "light";
3
+ readonly isDark: boolean;
4
+ toggleTheme: () => void;
5
+ };
@@ -0,0 +1,55 @@
1
+ const THEME_STORAGE_KEY = 'theme-preference';
2
+ const DARK_CLASS = 'dark';
3
+ let themeState = $state('light');
4
+ let isDark = $state(false);
5
+ const getInitialTheme = () => {
6
+ if (typeof window === 'undefined') {
7
+ return 'light';
8
+ }
9
+ const storedTheme = localStorage.getItem(THEME_STORAGE_KEY);
10
+ if (storedTheme === 'dark' || storedTheme === 'light') {
11
+ return storedTheme;
12
+ }
13
+ if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
14
+ return 'dark';
15
+ }
16
+ return 'light';
17
+ };
18
+ const initializeTheme = () => {
19
+ const initialTheme = getInitialTheme();
20
+ themeState = initialTheme;
21
+ isDark = initialTheme === 'dark';
22
+ if (typeof window !== 'undefined') {
23
+ const htmlElement = document.documentElement;
24
+ if (isDark) {
25
+ htmlElement.classList.add(DARK_CLASS);
26
+ }
27
+ else {
28
+ htmlElement.classList.remove(DARK_CLASS);
29
+ }
30
+ }
31
+ };
32
+ initializeTheme();
33
+ const toggleTheme = () => {
34
+ themeState = themeState === 'light' ? 'dark' : 'light';
35
+ isDark = themeState === 'dark';
36
+ const htmlElement = document.documentElement;
37
+ if (isDark) {
38
+ htmlElement.classList.add(DARK_CLASS);
39
+ }
40
+ else {
41
+ htmlElement.classList.remove(DARK_CLASS);
42
+ }
43
+ if (typeof window !== 'undefined') {
44
+ localStorage.setItem(THEME_STORAGE_KEY, themeState);
45
+ }
46
+ };
47
+ export const theme = {
48
+ get state() {
49
+ return themeState;
50
+ },
51
+ get isDark() {
52
+ return isDark;
53
+ },
54
+ toggleTheme
55
+ };
@@ -0,0 +1,19 @@
1
+ import type { IconName } from '../types.js';
2
+ export interface ToastMessage {
3
+ id: string;
4
+ icon?: IconName;
5
+ title?: string;
6
+ description: string;
7
+ duration?: number;
8
+ position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
9
+ isSolid?: boolean;
10
+ status: 'success' | 'danger' | 'info' | 'warning';
11
+ }
12
+ export declare const toast: {
13
+ readonly messages: ToastMessage[];
14
+ show: (message: Omit<ToastMessage, "id"> & {
15
+ id?: string;
16
+ }) => string;
17
+ close: (id: string) => void;
18
+ closeAll: () => void;
19
+ };
@@ -0,0 +1,38 @@
1
+ let toastMessages = $state([]);
2
+ const generateId = () => {
3
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
4
+ };
5
+ const toastShow = (message) => {
6
+ const id = message.id || generateId();
7
+ const newMessage = {
8
+ id,
9
+ title: message.title,
10
+ description: message.description,
11
+ status: message.status || 'info',
12
+ duration: message.duration || 0,
13
+ icon: message.icon,
14
+ position: message.position,
15
+ isSolid: message.isSolid
16
+ };
17
+ toastMessages = [...toastMessages, newMessage];
18
+ if (newMessage.duration && newMessage.duration > 0) {
19
+ setTimeout(() => {
20
+ toastClose(id);
21
+ }, newMessage.duration);
22
+ }
23
+ return id;
24
+ };
25
+ const toastClose = (id) => {
26
+ toastMessages = toastMessages.filter((m) => m.id !== id);
27
+ };
28
+ const toastCloseAll = () => {
29
+ toastMessages = [];
30
+ };
31
+ export const toast = {
32
+ get messages() {
33
+ return toastMessages;
34
+ },
35
+ show: toastShow,
36
+ close: toastClose,
37
+ closeAll: toastCloseAll
38
+ };
@@ -0,0 +1,75 @@
1
+ export interface DatePosition {
2
+ top: number;
3
+ left: number;
4
+ width: string | number;
5
+ origin: string;
6
+ }
7
+ export interface DateFormatOptions {
8
+ year?: 'numeric' | '2-digit';
9
+ month?: 'numeric' | '2-digit' | 'long' | 'short' | 'narrow';
10
+ day?: 'numeric' | '2-digit';
11
+ }
12
+ export type Scale = (value: number) => number;
13
+ export type BandScale = ((value: string) => number) & {
14
+ bandwidth: () => number;
15
+ step: () => number;
16
+ };
17
+ export interface ChartConfig {
18
+ [key: string]: {
19
+ label: string;
20
+ color: string;
21
+ icon?: string;
22
+ };
23
+ }
24
+ export interface ChartDataPoint {
25
+ [key: string]: string | number;
26
+ }
27
+ export interface ChartMargin {
28
+ top: number;
29
+ right: number;
30
+ bottom: number;
31
+ left: number;
32
+ }
33
+ export type ChartData = ChartDataPoint[];
34
+ export interface ChartProps {
35
+ data: ChartData;
36
+ config: ChartConfig;
37
+ className?: string;
38
+ width?: number;
39
+ height?: number;
40
+ }
41
+ export interface BarChartProps extends ChartProps {
42
+ xKey: string;
43
+ yKeys: string[];
44
+ showGrid?: boolean;
45
+ showAxis?: boolean;
46
+ barSpacing?: number;
47
+ }
48
+ export interface LineChartProps extends ChartProps {
49
+ xKey: string;
50
+ yKeys: string[];
51
+ showGrid?: boolean;
52
+ showAxis?: boolean;
53
+ smooth?: boolean;
54
+ showDots?: boolean;
55
+ }
56
+ export interface PieChartProps extends ChartProps {
57
+ valueKey: string;
58
+ labelKey: string;
59
+ showLabels?: boolean;
60
+ innerRadius?: number;
61
+ }
62
+ export interface AreaChartProps extends ChartProps {
63
+ xKey: string;
64
+ yKeys: string[];
65
+ showGrid?: boolean;
66
+ showAxis?: boolean;
67
+ smooth?: boolean;
68
+ stacked?: boolean;
69
+ }
70
+ export interface DoughnutChartProps extends ChartProps {
71
+ valueKey: string;
72
+ labelKey: string;
73
+ showLabels?: boolean;
74
+ innerRadius?: number;
75
+ }
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,27 @@
1
+ import type { BandScale, ChartMargin, Scale } from '../types.js';
2
+ export declare function calculateDomain(data: any[], key: string): [number, number];
3
+ export declare function createLinearScale(domain: [number, number], range: [number, number]): Scale;
4
+ export declare function createBandScale(domain: string[], range: [number, number], padding?: number): BandScale;
5
+ export declare const DEFAULT_MARGIN: ChartMargin;
6
+ export declare function getChartDimensions(width: number, height: number, margin: ChartMargin): {
7
+ width: number;
8
+ height: number;
9
+ };
10
+ export declare function generateGridLines(domain: [number, number], scale: Scale, count?: number): Array<{
11
+ value: number;
12
+ position: number;
13
+ }>;
14
+ export declare function polarToCartesian(centerX: number, centerY: number, radius: number, angleInDegrees: number): {
15
+ x: number;
16
+ y: number;
17
+ };
18
+ export declare function createArcPath(centerX: number, centerY: number, radius: number, startAngle: number, endAngle: number, innerRadius?: number): string;
19
+ export declare function createSmoothPath(points: Array<{
20
+ x: number;
21
+ y: number;
22
+ }>): string;
23
+ export declare function createLinearPath(points: Array<{
24
+ x: number;
25
+ y: number;
26
+ }>): string;
27
+ export declare function generateColors(count: number): string[];
@@ -0,0 +1,140 @@
1
+ export function calculateDomain(data, key) {
2
+ const values = data.map((d) => Number(d[key])).filter((v) => !isNaN(v));
3
+ if (values.length === 0)
4
+ return [0, 1];
5
+ const min = Math.min(...values);
6
+ const max = Math.max(...values);
7
+ const padding = (max - min) * 0.1;
8
+ return [Math.min(0, min - padding), max + padding];
9
+ }
10
+ export function createLinearScale(domain, range) {
11
+ const [domainMin, domainMax] = domain;
12
+ const [rangeMin, rangeMax] = range;
13
+ return (value) => {
14
+ if (domainMax === domainMin)
15
+ return rangeMin;
16
+ const ratio = (value - domainMin) / (domainMax - domainMin);
17
+ return rangeMin + ratio * (rangeMax - rangeMin);
18
+ };
19
+ }
20
+ export function createBandScale(domain, range, padding = 0.1) {
21
+ const [rangeMin, rangeMax] = range;
22
+ const rangeSize = rangeMax - rangeMin;
23
+ const step = rangeSize / domain.length;
24
+ const bandwidth = step * (1 - padding);
25
+ const paddingOuter = (step * padding) / 2;
26
+ const scale = (value) => {
27
+ const index = domain.indexOf(value);
28
+ return rangeMin + paddingOuter + index * step;
29
+ };
30
+ scale.bandwidth = () => bandwidth;
31
+ scale.step = () => step;
32
+ return scale;
33
+ }
34
+ export const DEFAULT_MARGIN = {
35
+ top: 20,
36
+ right: 30,
37
+ bottom: 40,
38
+ left: 40
39
+ };
40
+ export function getChartDimensions(width, height, margin) {
41
+ return {
42
+ width: width - margin.left - margin.right,
43
+ height: height - margin.top - margin.bottom
44
+ };
45
+ }
46
+ export function generateGridLines(domain, scale, count = 5) {
47
+ const [min, max] = domain;
48
+ return Array.from({ length: count + 1 }, (_, i) => {
49
+ const value = min + ((max - min) * i) / count;
50
+ return {
51
+ value,
52
+ position: scale(value)
53
+ };
54
+ });
55
+ }
56
+ export function polarToCartesian(centerX, centerY, radius, angleInDegrees) {
57
+ const angleInRadians = ((angleInDegrees - 90) * Math.PI) / 180.0;
58
+ return {
59
+ x: centerX + radius * Math.cos(angleInRadians),
60
+ y: centerY + radius * Math.sin(angleInRadians)
61
+ };
62
+ }
63
+ export function createArcPath(centerX, centerY, radius, startAngle, endAngle, innerRadius = 0) {
64
+ const start = polarToCartesian(centerX, centerY, radius, endAngle);
65
+ const end = polarToCartesian(centerX, centerY, radius, startAngle);
66
+ const largeArcFlag = endAngle - startAngle <= 180 ? '0' : '1';
67
+ if (innerRadius > 0) {
68
+ // Donut/doughnut chart
69
+ const innerStart = polarToCartesian(centerX, centerY, innerRadius, endAngle);
70
+ const innerEnd = polarToCartesian(centerX, centerY, innerRadius, startAngle);
71
+ return [
72
+ 'M',
73
+ start.x,
74
+ start.y,
75
+ 'A',
76
+ radius,
77
+ radius,
78
+ 0,
79
+ largeArcFlag,
80
+ 0,
81
+ end.x,
82
+ end.y,
83
+ 'L',
84
+ innerEnd.x,
85
+ innerEnd.y,
86
+ 'A',
87
+ innerRadius,
88
+ innerRadius,
89
+ 0,
90
+ largeArcFlag,
91
+ 1,
92
+ innerStart.x,
93
+ innerStart.y,
94
+ 'Z'
95
+ ].join(' ');
96
+ }
97
+ else {
98
+ return [
99
+ 'M',
100
+ centerX,
101
+ centerY,
102
+ 'L',
103
+ start.x,
104
+ start.y,
105
+ 'A',
106
+ radius,
107
+ radius,
108
+ 0,
109
+ largeArcFlag,
110
+ 0,
111
+ end.x,
112
+ end.y,
113
+ 'Z'
114
+ ].join(' ');
115
+ }
116
+ }
117
+ export function createSmoothPath(points) {
118
+ if (points.length === 0)
119
+ return '';
120
+ if (points.length === 1)
121
+ return `M ${points[0].x} ${points[0].y}`;
122
+ let path = `M ${points[0].x} ${points[0].y}`;
123
+ for (let i = 1; i < points.length; i++) {
124
+ const prev = points[i - 1];
125
+ const curr = points[i];
126
+ const controlPointX = (prev.x + curr.x) / 2;
127
+ path += ` Q ${controlPointX} ${prev.y} ${curr.x} ${curr.y}`;
128
+ }
129
+ return path;
130
+ }
131
+ export function createLinearPath(points) {
132
+ if (points.length === 0)
133
+ return '';
134
+ return points
135
+ .map((point, i) => (i === 0 ? `M ${point.x} ${point.y}` : `L ${point.x} ${point.y}`))
136
+ .join(' ');
137
+ }
138
+ export function generateColors(count) {
139
+ return Array.from({ length: count }, (_, i) => `hsl(${(i * 360) / count}, 70%, 50%)`);
140
+ }
@@ -0,0 +1 @@
1
+ export declare const cn: (...classes: (string | boolean | undefined)[]) => string;
@@ -0,0 +1,3 @@
1
+ export const cn = (...classes) => {
2
+ return classes.filter(Boolean).join(' ');
3
+ };
@@ -0,0 +1,3 @@
1
+ export declare const clickOutside: (node: HTMLElement, handler: () => void) => {
2
+ destroy: () => void;
3
+ };
@@ -0,0 +1,9 @@
1
+ export const clickOutside = (node, handler) => {
2
+ const onClick = (event) => node && !node.contains(event.target) && handler();
3
+ document.addEventListener('click', onClick, true);
4
+ return {
5
+ destroy() {
6
+ document.removeEventListener('click', onClick, true);
7
+ }
8
+ };
9
+ };
@@ -0,0 +1,3 @@
1
+ export declare const popover: (node: HTMLElement) => {
2
+ destroy: () => void;
3
+ };
@@ -0,0 +1,17 @@
1
+ export const popover = (node) => {
2
+ const targetEl = document.body;
3
+ const hadScroll = document.documentElement.scrollHeight > window.innerHeight;
4
+ node.id = 'popover';
5
+ targetEl?.appendChild(node);
6
+ if (hadScroll) {
7
+ targetEl.classList.add('had-scroll');
8
+ }
9
+ return {
10
+ destroy() {
11
+ if (hadScroll) {
12
+ targetEl.classList.remove('had-scroll');
13
+ }
14
+ node.remove();
15
+ }
16
+ };
17
+ };
@@ -0,0 +1 @@
1
+ export declare const generateULID: () => string;
@@ -0,0 +1,22 @@
1
+ const CHARSET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
2
+ export const generateULID = () => {
3
+ const timestamp = Date.now();
4
+ const timestampPart = encodeTime(timestamp);
5
+ const randomPart = encodeRandom();
6
+ return timestampPart + randomPart;
7
+ };
8
+ function encodeTime(timestamp) {
9
+ const encoded = new Array(10);
10
+ for (let i = 9; i >= 0; i--) {
11
+ encoded[i] = CHARSET[timestamp & 31];
12
+ timestamp = Math.floor(timestamp / 32);
13
+ }
14
+ return encoded.join('');
15
+ }
16
+ function encodeRandom() {
17
+ const encoded = new Array(16);
18
+ for (let i = 0; i < 16; i++) {
19
+ encoded[i] = CHARSET[Math.floor(Math.random() * 32)];
20
+ }
21
+ return encoded.join('');
22
+ }
@@ -0,0 +1,2 @@
1
+ import type { ValidationRules } from '../hooks/use-form.svelte.js';
2
+ export declare const validateSchema: (body: Record<string, any>, rules: ValidationRules) => Record<string, string>;