svelte-comp 1.2.7 → 1.3.5

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 (139) hide show
  1. package/README.md +12 -11
  2. package/dist/App.svelte +497 -2
  3. package/dist/app.css +2 -3
  4. package/dist/app.d.ts +10 -0
  5. package/dist/lang.d.ts +3 -3
  6. package/dist/lang.js +3 -3
  7. package/dist/lib/Accordion.svelte +14 -14
  8. package/dist/lib/Badge.svelte +44 -0
  9. package/dist/lib/Badge.svelte.d.ts +10 -0
  10. package/dist/lib/Button.svelte +23 -8
  11. package/dist/lib/Calendar.svelte +384 -377
  12. package/dist/lib/Card.svelte +6 -6
  13. package/dist/lib/Carousel.svelte +16 -16
  14. package/dist/lib/Carousel.svelte.d.ts +1 -1
  15. package/dist/lib/CheckBox.svelte +2 -2
  16. package/dist/lib/CodeView.svelte +6 -5
  17. package/dist/lib/ColorPicker.svelte +6 -6
  18. package/dist/lib/ContextMenu.svelte +328 -0
  19. package/dist/lib/ContextMenu.svelte.d.ts +14 -0
  20. package/dist/lib/DatePicker.svelte +161 -161
  21. package/dist/lib/Dialog.svelte +10 -10
  22. package/dist/lib/Field.svelte +1 -1
  23. package/dist/lib/FilePicker.svelte +127 -74
  24. package/dist/lib/FilePicker.svelte.d.ts +6 -3
  25. package/dist/lib/Hamburger.svelte +27 -21
  26. package/dist/lib/InstallPWA.svelte +94 -0
  27. package/dist/lib/InstallPWA.svelte.d.ts +8 -0
  28. package/dist/lib/Menu.svelte +18 -18
  29. package/dist/lib/NoticeBase.svelte +140 -0
  30. package/dist/lib/NoticeBase.svelte.d.ts +43 -0
  31. package/dist/lib/PrimaryColorSelect.svelte +6 -6
  32. package/dist/lib/ProgressCircle.svelte +7 -9
  33. package/dist/lib/ProgressCircle.svelte.d.ts +7 -9
  34. package/dist/lib/SearchInput.svelte +6 -6
  35. package/dist/lib/Select.svelte +2 -2
  36. package/dist/lib/Slider.svelte +1 -1
  37. package/dist/lib/Splitter.svelte +15 -6
  38. package/dist/lib/Switch.svelte +5 -4
  39. package/dist/lib/Tabs.svelte +6 -6
  40. package/dist/lib/ThemeToggle.svelte +1 -0
  41. package/dist/lib/TimePicker.svelte +103 -95
  42. package/dist/lib/TimePickerNew.svelte +634 -0
  43. package/dist/lib/TimePickerNew.svelte.d.ts +49 -0
  44. package/dist/lib/Toast.svelte +17 -120
  45. package/dist/lib/Tooltip.svelte +7 -7
  46. package/dist/lib/Topbar.svelte +112 -0
  47. package/dist/lib/Topbar.svelte.d.ts +44 -0
  48. package/dist/lib/__tests__/Accordion.test.d.ts +1 -0
  49. package/dist/lib/__tests__/Accordion.test.js +171 -0
  50. package/dist/lib/__tests__/Badge.test.d.ts +1 -0
  51. package/dist/lib/__tests__/Badge.test.js +41 -0
  52. package/dist/lib/__tests__/Button.test.d.ts +1 -0
  53. package/dist/lib/__tests__/Button.test.js +269 -0
  54. package/dist/lib/__tests__/Calendar.test.d.ts +1 -0
  55. package/dist/lib/__tests__/Calendar.test.js +171 -0
  56. package/dist/lib/__tests__/Card.test.d.ts +1 -0
  57. package/dist/lib/__tests__/Card.test.js +148 -0
  58. package/dist/lib/__tests__/Carousel.test.d.ts +1 -0
  59. package/dist/lib/__tests__/Carousel.test.js +439 -0
  60. package/dist/lib/__tests__/CheckBox.test.d.ts +1 -0
  61. package/dist/lib/__tests__/CheckBox.test.js +152 -0
  62. package/dist/lib/__tests__/CodeView.test.d.ts +1 -0
  63. package/dist/lib/__tests__/CodeView.test.js +157 -0
  64. package/dist/lib/__tests__/ColorPicker.test.d.ts +1 -0
  65. package/dist/lib/__tests__/ColorPicker.test.js +93 -0
  66. package/dist/lib/__tests__/ContextMenu.test.d.ts +1 -0
  67. package/dist/lib/__tests__/ContextMenu.test.js +67 -0
  68. package/dist/lib/__tests__/DatePicker.test.d.ts +1 -0
  69. package/dist/lib/__tests__/DatePicker.test.js +108 -0
  70. package/dist/lib/__tests__/Dialog.test.d.ts +1 -0
  71. package/dist/lib/__tests__/Dialog.test.js +183 -0
  72. package/dist/lib/__tests__/Field.test.d.ts +1 -0
  73. package/dist/lib/__tests__/Field.test.js +190 -0
  74. package/dist/lib/__tests__/FilePicker.test.d.ts +1 -0
  75. package/dist/lib/__tests__/FilePicker.test.js +179 -0
  76. package/dist/lib/__tests__/Form.integration.test.d.ts +1 -0
  77. package/dist/lib/__tests__/Form.integration.test.js +158 -0
  78. package/dist/lib/__tests__/Form.test.d.ts +1 -0
  79. package/dist/lib/__tests__/Form.test.js +463 -0
  80. package/dist/lib/__tests__/Hamburger.test.d.ts +1 -0
  81. package/dist/lib/__tests__/Hamburger.test.js +161 -0
  82. package/dist/lib/__tests__/InstallPWA.test.d.ts +1 -0
  83. package/dist/lib/__tests__/InstallPWA.test.js +15 -0
  84. package/dist/lib/__tests__/Menu.test.d.ts +1 -0
  85. package/dist/lib/__tests__/Menu.test.js +285 -0
  86. package/dist/lib/__tests__/NoticeBase.test.d.ts +1 -0
  87. package/dist/lib/__tests__/NoticeBase.test.js +60 -0
  88. package/dist/lib/__tests__/PaginatedCard.test.d.ts +1 -0
  89. package/dist/lib/__tests__/PaginatedCard.test.js +89 -0
  90. package/dist/lib/__tests__/Pagination.test.d.ts +1 -0
  91. package/dist/lib/__tests__/Pagination.test.js +168 -0
  92. package/dist/lib/__tests__/PrimaryColorSelect.test.d.ts +1 -0
  93. package/dist/lib/__tests__/PrimaryColorSelect.test.js +92 -0
  94. package/dist/lib/__tests__/ProgressBar.test.d.ts +1 -0
  95. package/dist/lib/__tests__/ProgressBar.test.js +69 -0
  96. package/dist/lib/__tests__/ProgressCircle.test.d.ts +1 -0
  97. package/dist/lib/__tests__/ProgressCircle.test.js +71 -0
  98. package/dist/lib/__tests__/Radio.test.d.ts +1 -0
  99. package/dist/lib/__tests__/Radio.test.js +127 -0
  100. package/dist/lib/__tests__/SearchInput.test.d.ts +1 -0
  101. package/dist/lib/__tests__/SearchInput.test.js +80 -0
  102. package/dist/lib/__tests__/Select.test.d.ts +1 -0
  103. package/dist/lib/__tests__/Select.test.js +408 -0
  104. package/dist/lib/__tests__/Slider.test.d.ts +1 -0
  105. package/dist/lib/__tests__/Slider.test.js +213 -0
  106. package/dist/lib/__tests__/Splitter.test.d.ts +1 -0
  107. package/dist/lib/__tests__/Splitter.test.js +87 -0
  108. package/dist/lib/__tests__/Switch.test.d.ts +1 -0
  109. package/dist/lib/__tests__/Switch.test.js +97 -0
  110. package/dist/lib/__tests__/Table.test.d.ts +1 -0
  111. package/dist/lib/__tests__/Table.test.js +349 -0
  112. package/dist/lib/__tests__/Tabs.test.d.ts +1 -0
  113. package/dist/lib/__tests__/Tabs.test.js +262 -0
  114. package/dist/lib/__tests__/ThemeToggle.test.d.ts +1 -0
  115. package/dist/lib/__tests__/ThemeToggle.test.js +84 -0
  116. package/dist/lib/__tests__/TimePicker.test.d.ts +1 -0
  117. package/dist/lib/__tests__/TimePicker.test.js +146 -0
  118. package/dist/lib/__tests__/TimePickerNew.test.d.ts +1 -0
  119. package/dist/lib/__tests__/TimePickerNew.test.js +322 -0
  120. package/dist/lib/__tests__/Toast.test.d.ts +1 -0
  121. package/dist/lib/__tests__/Toast.test.js +135 -0
  122. package/dist/lib/__tests__/Tooltip.test.d.ts +1 -0
  123. package/dist/lib/__tests__/Tooltip.test.js +171 -0
  124. package/dist/lib/__tests__/Topbar.test.d.ts +1 -0
  125. package/dist/lib/__tests__/Topbar.test.js +25 -0
  126. package/dist/lib/__tests__/setupLangContext.d.ts +1 -0
  127. package/dist/lib/__tests__/setupLangContext.js +65 -0
  128. package/dist/lib/__tests__/storage.test.d.ts +1 -0
  129. package/dist/lib/__tests__/storage.test.js +124 -0
  130. package/dist/lib/__tests__/utils.test.d.ts +1 -0
  131. package/dist/lib/__tests__/utils.test.js +11 -0
  132. package/dist/lib/index.d.ts +5 -0
  133. package/dist/lib/index.js +5 -0
  134. package/dist/lib/lang.d.ts +64 -0
  135. package/dist/lib/lang.js +64 -0
  136. package/dist/lib/types/index.d.ts +1 -0
  137. package/dist/styles.css +2 -0
  138. package/dist/utils/index.js +15 -4
  139. package/package.json +12 -12
package/dist/lang.js CHANGED
@@ -1,6 +1,6 @@
1
1
  var enTexts = {
2
2
  app: {
3
- version: "v1.2.6",
3
+ version: "v1.3.3",
4
4
  title: "Svelte 5 UI Components",
5
5
  footer: "© 2025 MaestroFusion360",
6
6
  authorUrl: "https://github.com/MaestroFusion360/svelte-comp",
@@ -361,7 +361,7 @@ var enTexts = {
361
361
  };
362
362
  var ruTexts = {
363
363
  app: {
364
- version: "v1.2.6",
364
+ version: "v1.3.3",
365
365
  title: "Svelte 5 UI Components",
366
366
  footer: "© 2025 MaestroFusion360",
367
367
  authorUrl: "https://github.com/MaestroFusion360/svelte-comp",
@@ -723,7 +723,7 @@ var ruTexts = {
723
723
  };
724
724
  var esTexts = {
725
725
  app: {
726
- version: "v1.2.6",
726
+ version: "v1.3.3",
727
727
  title: "Svelte 5 UI Components",
728
728
  footer: "© 2025 MaestroFusion360",
729
729
  authorUrl: "https://github.com/MaestroFusion360/svelte-comp",
@@ -51,22 +51,22 @@
51
51
  }: Props = $props();
52
52
 
53
53
  const base =
54
- "w-full border border-[var(--border-color-default)] bg-[var(--color-bg-surface)] shadow-sm";
54
+ "w-full border border-[var(--border-color-default)] bg-[var(--color-bg-surface)] shadow-[0_1px_2px_var(--shadow-color)]";
55
55
 
56
56
  const sizes: Record<SizeKey, string> = {
57
- xs: "rounded-[var(--radius-md)] text-sm",
58
- sm: "rounded-[var(--radius-md)] text-base",
59
- md: "rounded-[var(--radius-lg)] text-lg",
60
- lg: "rounded-[var(--radius-lg)] text-xl",
61
- xl: "rounded-[var(--radius-xl)] text-2xl",
57
+ xs: cx("rounded-[var(--radius-md)]", TEXT.xs),
58
+ sm: cx("rounded-[var(--radius-md)]", TEXT.sm),
59
+ md: cx("rounded-[var(--radius-lg)]", TEXT.md),
60
+ lg: cx("rounded-[var(--radius-lg)]", TEXT.lg),
61
+ xl: cx("rounded-[var(--radius-xl)]", TEXT.xl),
62
62
  };
63
63
 
64
64
  const contentSize: Record<SizeKey, string> = {
65
- xs: "px-4 pb-4 mt-1",
66
- sm: "px-5 pb-5 mt-2",
67
- md: "px-6 pb-6 mt-3",
68
- lg: "px-8 pb-8 mt-4",
69
- xl: "px-10 pb-10 mt-5",
65
+ xs: "px-[var(--spacing-md)] pb-[var(--spacing-md)] mt-[var(--spacing-xs)]",
66
+ sm: "px-[calc(var(--spacing-md)+var(--spacing-xs))] pb-[calc(var(--spacing-md)+var(--spacing-xs))] mt-[var(--spacing-sm)]",
67
+ md: "px-[calc(var(--spacing-md)+var(--spacing-sm))] pb-[calc(var(--spacing-md)+var(--spacing-sm))] mt-[calc(var(--spacing-sm)+var(--spacing-xs))]",
68
+ lg: "px-[var(--spacing-xl)] pb-[var(--spacing-xl)] mt-[var(--spacing-md)]",
69
+ xl: "px-[calc(var(--spacing-xl)+var(--spacing-sm))] pb-[calc(var(--spacing-xl)+var(--spacing-sm))] mt-[calc(var(--spacing-md)+var(--spacing-xs))]",
70
70
  };
71
71
 
72
72
  const iconSize: Record<SizeKey, string> = {
@@ -110,14 +110,14 @@
110
110
  <h3>
111
111
  <button
112
112
  type="button"
113
- class="flex w-full items-center justify-between gap-3 p-2 text-left font-medium text-[var(--color-text-default)] bg-transparent transition-colors hover:bg-[var(--color-bg-hover)] active:bg-[var(--color-bg-active)] focus:outline-none focus:ring-2 focus:ring-[var(--border-color-focus)] focus:ring-inset"
113
+ class="flex w-full items-center justify-between gap-[calc(var(--spacing-sm)+var(--spacing-xs))] p-[var(--spacing-sm)] text-left font-medium text-[var(--color-text-default)] bg-transparent transition-colors hover:bg-[var(--color-bg-hover)] active:bg-[var(--color-bg-active)] focus:outline-none focus:ring-2 focus:ring-[var(--border-color-focus)] focus:ring-inset"
114
114
  aria-expanded={isOpen(i)}
115
115
  onclick={() => toggle(i)}
116
116
  >
117
117
  <span>{item.title}</span>
118
118
  <svg
119
119
  class={cx(
120
- "shrink-0 transition-transform duration-200 text-[var(--color-text-muted)]",
120
+ "shrink-0 transition-transform duration-[var(--transition-fast)] text-[var(--color-text-muted)]",
121
121
  iconClass
122
122
  )}
123
123
  class:rotate-180={isOpen(i)}
@@ -135,7 +135,7 @@
135
135
  </h3>
136
136
 
137
137
  <div
138
- class="grid overflow-hidden transition-[grid-template-rows] duration-200"
138
+ class="grid overflow-hidden transition-[grid-template-rows] duration-[var(--transition-fast)]"
139
139
  class:grid-rows-[1fr]={isOpen(i)}
140
140
  class:grid-rows-[0fr]={!isOpen(i)}
141
141
  >
@@ -0,0 +1,44 @@
1
+ <!-- src/lib/Badge.svelte -->
2
+ <script lang="ts">
3
+ /**
4
+ * @component Badge
5
+ * @description Compact status badge for inline labels and small indicators.
6
+ *
7
+ * @prop message {string} - Badge text
8
+ *
9
+ * @prop variant {ToastVariant} - Visual style
10
+ * @options success|danger|warning|info
11
+ * @default info
12
+ *
13
+ * @prop showIcon {boolean} - Shows a variant icon
14
+ * @default false
15
+ *
16
+ * @prop class {string} - Additional wrapper classes
17
+ * @default ""
18
+ *
19
+ * @note Intended for inline status labels.
20
+ * @note Uses NoticeBase for shared styling with Toast.
21
+ */
22
+ import NoticeBase from "./NoticeBase.svelte";
23
+ import type { ToastVariant } from "./types";
24
+
25
+ let {
26
+ message,
27
+ variant = "info",
28
+ showIcon = false,
29
+ class: externalClass = "",
30
+ }: {
31
+ message: string;
32
+ variant?: ToastVariant;
33
+ showIcon?: boolean;
34
+ class?: string;
35
+ } = $props();
36
+ </script>
37
+
38
+ <NoticeBase
39
+ {message}
40
+ {variant}
41
+ {showIcon}
42
+ inline
43
+ class={externalClass}
44
+ />
@@ -0,0 +1,10 @@
1
+ import type { ToastVariant } from "./types";
2
+ type $$ComponentProps = {
3
+ message: string;
4
+ variant?: ToastVariant;
5
+ showIcon?: boolean;
6
+ class?: string;
7
+ };
8
+ declare const Badge: import("svelte").Component<$$ComponentProps, {}, "">;
9
+ type Badge = ReturnType<typeof Badge>;
10
+ export default Badge;
@@ -70,6 +70,7 @@
70
70
  relative inline-flex items-center justify-center gap-2 rounded-[var(--radius-md)] border font-medium
71
71
  transition-all duration-[var(--transition-fast)] ease-[var(--timing-default)] whitespace-nowrap select-none
72
72
  focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--border-color-focus)]
73
+ [@media(pointer:coarse)]:min-h-11 [@media(pointer:coarse)]:min-w-11
73
74
  disabled:opacity-[var(--opacity-disabled)]
74
75
  disabled:cursor-not-allowed
75
76
  disabled:brightness-100
@@ -87,20 +88,20 @@
87
88
 
88
89
  const variants: Record<ButtonVariant, string> = {
89
90
  primary:
90
- "bg-[var(--color-bg-primary)] text-white border-[var(--border-color-primary)] hover:brightness-110 active:scale-95",
91
+ "bg-[var(--color-bg-primary)] text-[var(--color-text-inverse,#fff)] border-[var(--border-color-primary)] hover:brightness-110 active:scale-95",
91
92
  secondary:
92
93
  "bg-[var(--color-bg-secondary)] [color:var(--color-text-default)] border-[var(--border-color-default)] hover:bg-[var(--color-bg-hover)] active:scale-95",
93
- pill: "bg-[var(--color-bg-primary)] text-white border-[var(--border-color-primary)] rounded-full hover:brightness-110 active:scale-95",
94
+ pill: "bg-[var(--color-bg-primary)] text-[var(--color-text-inverse,#fff)] border-[var(--border-color-primary)] rounded-full hover:brightness-110 active:scale-95",
94
95
  danger:
95
- "bg-[var(--color-bg-danger)] text-white border-[var(--color-bg-danger)] hover:brightness-110 active:scale-95",
96
+ "bg-[var(--color-bg-danger)] text-[var(--color-text-inverse,#fff)] border-[var(--color-bg-danger)] hover:brightness-110 active:scale-95",
96
97
  success:
97
- "bg-[var(--color-bg-success)] text-white border-[var(--color-bg-success)] hover:brightness-110 active:scale-95",
98
+ "bg-[var(--color-bg-success)] text-[var(--color-text-inverse,#fff)] border-[var(--color-bg-success)] hover:brightness-110 active:scale-95",
98
99
  warning:
99
- "bg-[var(--color-bg-warning)] text-white border-[var(--color-bg-warning)] hover:brightness-110 active:scale-95",
100
+ "bg-[var(--color-bg-warning)] text-[var(--color-text-inverse,#fff)] border-[var(--color-bg-warning)] hover:brightness-110 active:scale-95",
100
101
  ghost:
101
102
  "bg-transparent [color:var(--color-text-default)] border-transparent hover:bg-[var(--color-bg-hover)] active:bg-[var(--color-bg-active)] active:scale-95",
102
103
  link: "bg-transparent underline border-transparent [color:var(--color-text-link)] hover:brightness-110 active:scale-95 transition-transform ",
103
- info: "bg-[var(--color-bg-secondary)] text-white border-[var(--border-color-default)] hover:bg-[var(--color-bg-hover)] active:scale-95",
104
+ info: "bg-[var(--color-bg-secondary)] text-[var(--color-text-inverse,#fff)] border-[var(--border-color-default)] hover:bg-[var(--color-bg-hover)] active:scale-95",
104
105
  };
105
106
 
106
107
  const buttonClass = $derived(
@@ -132,15 +133,29 @@
132
133
 
133
134
  function navigateToLink() {
134
135
  if (!link || typeof window === "undefined") return;
136
+ const safeLink = getSafeLink(link);
137
+ if (!safeLink) return;
135
138
 
136
139
  const restAttrs = rest as Record<string, unknown>;
137
140
  const target =
138
141
  typeof restAttrs.target === "string" ? restAttrs.target : undefined;
139
142
 
140
143
  if (target === "_blank") {
141
- window.open(link, "_blank", "noopener,noreferrer");
144
+ window.open(safeLink, "_blank", "noopener,noreferrer");
142
145
  } else {
143
- window.location.assign(link);
146
+ window.location.assign(safeLink);
147
+ }
148
+ }
149
+
150
+ function getSafeLink(value: string) {
151
+ try {
152
+ const url = new URL(value, window.location.href);
153
+ if (!["http:", "https:", "mailto:", "tel:"].includes(url.protocol)) {
154
+ return null;
155
+ }
156
+ return value;
157
+ } catch {
158
+ return null;
144
159
  }
145
160
  }
146
161
  </script>