twintrinsic 0.0.1

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 (212) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +150 -0
  3. package/dist/App/App.svelte +54 -0
  4. package/dist/App/App.svelte.d.ts +65 -0
  5. package/dist/Section.svelte +25 -0
  6. package/dist/Section.svelte.d.ts +34 -0
  7. package/dist/actions/clickOutside.d.ts +9 -0
  8. package/dist/actions/clickOutside.js +19 -0
  9. package/dist/actions/index.d.ts +1 -0
  10. package/dist/actions/index.js +1 -0
  11. package/dist/components/Accordion/Accordion.svelte +75 -0
  12. package/dist/components/Accordion/Accordion.svelte.d.ts +39 -0
  13. package/dist/components/Accordion/AccordionItem.svelte +150 -0
  14. package/dist/components/Accordion/AccordionItem.svelte.d.ts +30 -0
  15. package/dist/components/App/App.story.md +8 -0
  16. package/dist/components/App/App.story.svelte +170 -0
  17. package/dist/components/App/App.story.svelte.d.ts +22 -0
  18. package/dist/components/App/App.svelte +77 -0
  19. package/dist/components/App/App.svelte.d.ts +66 -0
  20. package/dist/components/App/Split.svelte +346 -0
  21. package/dist/components/App/Split.svelte.d.ts +54 -0
  22. package/dist/components/App/index.d.ts +2 -0
  23. package/dist/components/App/index.js +3 -0
  24. package/dist/components/AppHeader/AppHeader.svelte +439 -0
  25. package/dist/components/AppHeader/AppHeader.svelte.d.ts +24 -0
  26. package/dist/components/Avatar/Avatar.svelte +300 -0
  27. package/dist/components/Avatar/Avatar.svelte.d.ts +48 -0
  28. package/dist/components/Avatar/AvatarGroup.svelte +185 -0
  29. package/dist/components/Avatar/AvatarGroup.svelte.d.ts +46 -0
  30. package/dist/components/Badge/Badge.svelte +186 -0
  31. package/dist/components/Badge/Badge.svelte.d.ts +51 -0
  32. package/dist/components/BottomBar/BottomBar.svelte +146 -0
  33. package/dist/components/BottomBar/BottomBar.svelte.d.ts +38 -0
  34. package/dist/components/Breadcrumb/Breadcrumb.svelte +77 -0
  35. package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts +42 -0
  36. package/dist/components/Breadcrumb/BreadcrumbItem.svelte +171 -0
  37. package/dist/components/Breadcrumb/BreadcrumbItem.svelte.d.ts +38 -0
  38. package/dist/components/Button/Button.svelte +252 -0
  39. package/dist/components/Button/Button.svelte.d.ts +80 -0
  40. package/dist/components/Button/ButtonGroup.svelte +127 -0
  41. package/dist/components/Button/ButtonGroup.svelte.d.ts +44 -0
  42. package/dist/components/Card/Card.svelte +152 -0
  43. package/dist/components/Card/Card.svelte.d.ts +55 -0
  44. package/dist/components/Carousel/Carousel.svelte +461 -0
  45. package/dist/components/Carousel/Carousel.svelte.d.ts +79 -0
  46. package/dist/components/Carousel/CarouselItem.svelte +149 -0
  47. package/dist/components/Carousel/CarouselItem.svelte.d.ts +35 -0
  48. package/dist/components/Chip/Chip.svelte +288 -0
  49. package/dist/components/Chip/Chip.svelte.d.ts +71 -0
  50. package/dist/components/Chip/ChipGroup.svelte +190 -0
  51. package/dist/components/Chip/ChipGroup.svelte.d.ts +71 -0
  52. package/dist/components/CodeBlock/CodeBlock.svelte +356 -0
  53. package/dist/components/CodeBlock/CodeBlock.svelte.d.ts +44 -0
  54. package/dist/components/CodeBlock/index.d.ts +1 -0
  55. package/dist/components/CodeBlock/index.js +1 -0
  56. package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte +145 -0
  57. package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte.d.ts +44 -0
  58. package/dist/components/CodeEditor/CodeEditor.svelte +229 -0
  59. package/dist/components/CodeEditor/CodeEditor.svelte.d.ts +23 -0
  60. package/dist/components/Combobox/Combobox.svelte +279 -0
  61. package/dist/components/Combobox/Combobox.svelte.d.ts +34 -0
  62. package/dist/components/Container/Container.svelte +45 -0
  63. package/dist/components/Container/Container.svelte.d.ts +36 -0
  64. package/dist/components/DataTable/DataTable.svelte +879 -0
  65. package/dist/components/DataTable/DataTable.svelte.d.ts +102 -0
  66. package/dist/components/Form/AutoComplete.svelte +357 -0
  67. package/dist/components/Form/AutoComplete.svelte.d.ts +73 -0
  68. package/dist/components/Form/Calendar.svelte +429 -0
  69. package/dist/components/Form/Calendar.svelte.d.ts +53 -0
  70. package/dist/components/Form/Checkbox.svelte +196 -0
  71. package/dist/components/Form/Checkbox.svelte.d.ts +50 -0
  72. package/dist/components/Form/ColorPicker.svelte +396 -0
  73. package/dist/components/Form/ColorPicker.svelte.d.ts +43 -0
  74. package/dist/components/Form/Combobox.svelte +645 -0
  75. package/dist/components/Form/Combobox.svelte.d.ts +93 -0
  76. package/dist/components/Form/Dropdown.svelte +773 -0
  77. package/dist/components/Form/Dropdown.svelte.d.ts +81 -0
  78. package/dist/components/Form/FileUpload.svelte +796 -0
  79. package/dist/components/Form/FileUpload.svelte.d.ts +78 -0
  80. package/dist/components/Form/FloatLabel.svelte +245 -0
  81. package/dist/components/Form/FloatLabel.svelte.d.ts +44 -0
  82. package/dist/components/Form/Form.svelte +281 -0
  83. package/dist/components/Form/Form.svelte.d.ts +54 -0
  84. package/dist/components/Form/FormField.svelte +218 -0
  85. package/dist/components/Form/FormField.svelte.d.ts +47 -0
  86. package/dist/components/Form/Input.svelte +340 -0
  87. package/dist/components/Form/Input.svelte.d.ts +79 -0
  88. package/dist/components/Form/InputSwitch.svelte +189 -0
  89. package/dist/components/Form/InputSwitch.svelte.d.ts +46 -0
  90. package/dist/components/Form/InvalidState.svelte +97 -0
  91. package/dist/components/Form/InvalidState.svelte.d.ts +37 -0
  92. package/dist/components/Form/Knob.svelte +537 -0
  93. package/dist/components/Form/Knob.svelte.d.ts +78 -0
  94. package/dist/components/Form/ListInput.svelte +469 -0
  95. package/dist/components/Form/ListInput.svelte.d.ts +70 -0
  96. package/dist/components/Form/Listbox.svelte +513 -0
  97. package/dist/components/Form/Listbox.svelte.d.ts +74 -0
  98. package/dist/components/Form/NumberInput.svelte +452 -0
  99. package/dist/components/Form/NumberInput.svelte.d.ts +82 -0
  100. package/dist/components/Form/Radio.svelte +192 -0
  101. package/dist/components/Form/Radio.svelte.d.ts +53 -0
  102. package/dist/components/Form/RadioGroup.svelte +155 -0
  103. package/dist/components/Form/RadioGroup.svelte.d.ts +48 -0
  104. package/dist/components/Form/Rating.svelte +380 -0
  105. package/dist/components/Form/Rating.svelte.d.ts +64 -0
  106. package/dist/components/Form/Select.svelte +436 -0
  107. package/dist/components/Form/Select.svelte.d.ts +49 -0
  108. package/dist/components/Form/SelectGroup.svelte +34 -0
  109. package/dist/components/Form/SelectGroup.svelte.d.ts +33 -0
  110. package/dist/components/Form/Slider.svelte +622 -0
  111. package/dist/components/Form/Slider.svelte.d.ts +73 -0
  112. package/dist/components/Form/Switch.svelte +192 -0
  113. package/dist/components/Form/Switch.svelte.d.ts +46 -0
  114. package/dist/components/Form/TextInput.svelte +274 -0
  115. package/dist/components/Form/TextInput.svelte.d.ts +74 -0
  116. package/dist/components/Form/Textarea.svelte +207 -0
  117. package/dist/components/Form/Textarea.svelte.d.ts +62 -0
  118. package/dist/components/Icon/Icon.svelte +140 -0
  119. package/dist/components/Icon/Icon.svelte.d.ts +25 -0
  120. package/dist/components/Icon/index.d.ts +1 -0
  121. package/dist/components/Icon/index.js +1 -0
  122. package/dist/components/Lazy/Lazy.svelte +158 -0
  123. package/dist/components/Lazy/Lazy.svelte.d.ts +42 -0
  124. package/dist/components/Masonry/Masonry.svelte +299 -0
  125. package/dist/components/Masonry/Masonry.svelte.d.ts +55 -0
  126. package/dist/components/Menu/Menu/Menu.svelte +65 -0
  127. package/dist/components/Menu/Menu/Menu.svelte.d.ts +17 -0
  128. package/dist/components/Menu/Menu/MenuItem.svelte +90 -0
  129. package/dist/components/Menu/Menu/MenuItem.svelte.d.ts +27 -0
  130. package/dist/components/Modal/Modal.svelte +334 -0
  131. package/dist/components/Modal/Modal.svelte.d.ts +55 -0
  132. package/dist/components/Panel/Card.svelte +141 -0
  133. package/dist/components/Panel/Card.svelte.d.ts +52 -0
  134. package/dist/components/Panel/Hero/Hero.story.md +9 -0
  135. package/dist/components/Panel/Hero/Hero.story.svelte +49 -0
  136. package/dist/components/Panel/Hero/Hero.story.svelte.d.ts +21 -0
  137. package/dist/components/Panel/Hero/Hero.svelte +24 -0
  138. package/dist/components/Panel/Hero/Hero.svelte.d.ts +32 -0
  139. package/dist/components/Panel/LazyPanel.svelte +110 -0
  140. package/dist/components/Panel/LazyPanel.svelte.d.ts +46 -0
  141. package/dist/components/Panel/Panel.svelte +205 -0
  142. package/dist/components/Panel/Panel.svelte.d.ts +23 -0
  143. package/dist/components/Progress/Progress.svelte +220 -0
  144. package/dist/components/Progress/Progress.svelte.d.ts +61 -0
  145. package/dist/components/Separator/Separator.svelte +109 -0
  146. package/dist/components/Separator/Separator.svelte.d.ts +35 -0
  147. package/dist/components/Sidebar/Sidebar.svelte +213 -0
  148. package/dist/components/Sidebar/Sidebar.svelte.d.ts +60 -0
  149. package/dist/components/Skeleton/Skeleton.svelte +170 -0
  150. package/dist/components/Skeleton/Skeleton.svelte.d.ts +48 -0
  151. package/dist/components/Stepper/Stepper.svelte +111 -0
  152. package/dist/components/Stepper/Stepper.svelte.d.ts +54 -0
  153. package/dist/components/Stepper/StepperStep.svelte +369 -0
  154. package/dist/components/Stepper/StepperStep.svelte.d.ts +63 -0
  155. package/dist/components/Table/Table.svelte +167 -0
  156. package/dist/components/Table/Table.svelte.d.ts +56 -0
  157. package/dist/components/Table/TableBody.svelte +41 -0
  158. package/dist/components/Table/TableBody.svelte.d.ts +33 -0
  159. package/dist/components/Table/TableCell.svelte +76 -0
  160. package/dist/components/Table/TableCell.svelte.d.ts +36 -0
  161. package/dist/components/Table/TableHead.svelte +41 -0
  162. package/dist/components/Table/TableHead.svelte.d.ts +32 -0
  163. package/dist/components/Table/TableHeader.svelte +148 -0
  164. package/dist/components/Table/TableHeader.svelte.d.ts +42 -0
  165. package/dist/components/Table/TableRow.svelte +99 -0
  166. package/dist/components/Table/TableRow.svelte.d.ts +40 -0
  167. package/dist/components/Tabs/Tab.svelte +145 -0
  168. package/dist/components/Tabs/Tab.svelte.d.ts +36 -0
  169. package/dist/components/Tabs/TabList.svelte +60 -0
  170. package/dist/components/Tabs/TabList.svelte.d.ts +32 -0
  171. package/dist/components/Tabs/TabPanel.svelte +118 -0
  172. package/dist/components/Tabs/TabPanel.svelte.d.ts +38 -0
  173. package/dist/components/Tabs/Tabs.svelte +287 -0
  174. package/dist/components/Tabs/Tabs.svelte.d.ts +50 -0
  175. package/dist/components/Tag/Tag.svelte +260 -0
  176. package/dist/components/Tag/Tag.svelte.d.ts +54 -0
  177. package/dist/components/Tag/TagGroup.svelte +147 -0
  178. package/dist/components/Tag/TagGroup.svelte.d.ts +62 -0
  179. package/dist/components/ThemeToggle/ThemeToggle.svelte +93 -0
  180. package/dist/components/ThemeToggle/ThemeToggle.svelte.d.ts +12 -0
  181. package/dist/components/Timeline/Timeline.svelte +144 -0
  182. package/dist/components/Timeline/Timeline.svelte.d.ts +48 -0
  183. package/dist/components/Timeline/TimelineItem.svelte +391 -0
  184. package/dist/components/Timeline/TimelineItem.svelte.d.ts +63 -0
  185. package/dist/components/Toast/Toast.svelte +313 -0
  186. package/dist/components/Toast/Toast.svelte.d.ts +44 -0
  187. package/dist/components/Toast/toastStore.d.ts +40 -0
  188. package/dist/components/Toast/toastStore.js +293 -0
  189. package/dist/components/Tooltip/Tooltip.svelte +282 -0
  190. package/dist/components/Tooltip/Tooltip.svelte.d.ts +55 -0
  191. package/dist/components/Tree/Tree.svelte +129 -0
  192. package/dist/components/Tree/Tree.svelte.d.ts +61 -0
  193. package/dist/components/Tree/TreeNode.svelte +332 -0
  194. package/dist/components/Tree/TreeNode.svelte.d.ts +55 -0
  195. package/dist/components/icons/TwintrinsicLogo.svelte +73 -0
  196. package/dist/components/icons/TwintrinsicLogo.svelte.d.ts +17 -0
  197. package/dist/components/icons/twintrinsic-source.svg +73 -0
  198. package/dist/components/icons/twintrinsic.svg +38 -0
  199. package/dist/docs/EventsTable.svelte +86 -0
  200. package/dist/docs/EventsTable.svelte.d.ts +27 -0
  201. package/dist/docs/PropsTable.svelte +103 -0
  202. package/dist/docs/PropsTable.svelte.d.ts +28 -0
  203. package/dist/docs/index.d.ts +2 -0
  204. package/dist/docs/index.js +2 -0
  205. package/dist/helpers/detectLanguage.d.ts +6 -0
  206. package/dist/helpers/detectLanguage.js +60 -0
  207. package/dist/helpers/index.d.ts +1 -0
  208. package/dist/helpers/index.js +1 -0
  209. package/dist/index.d.ts +86 -0
  210. package/dist/index.js +94 -0
  211. package/dist/twintrinsic.css +347 -0
  212. package/package.json +98 -0
@@ -0,0 +1,186 @@
1
+ <!--
2
+ @component
3
+ Badge - A component for displaying small counts, status indicators, or labels.
4
+ Provides consistent styling, accessibility features, and various display options.
5
+
6
+ Usage:
7
+ ```svelte
8
+ <Badge>New</Badge>
9
+
10
+ <Badge variant="primary" size="lg">42</Badge>
11
+
12
+ <Badge variant="success" dot>Online</Badge>
13
+
14
+ <Button>
15
+ Notifications
16
+ <Badge variant="error">5</Badge>
17
+ </Button>
18
+ ```
19
+ -->
20
+ <script>
21
+ const {
22
+ /** @type {string} - Additional CSS classes */
23
+ class: className = "",
24
+
25
+ /** @type {string} - HTML id for accessibility */
26
+ id = crypto.randomUUID(),
27
+
28
+ /** @type {string} - Visual style variant */
29
+ variant = "default",
30
+
31
+ /** @type {string} - Size of the badge (sm, md, lg) */
32
+ size = "md",
33
+
34
+ /** @type {boolean} - Whether to show as a dot indicator */
35
+ dot = false,
36
+
37
+ /** @type {boolean} - Whether to show as a pill shape */
38
+ pill = false,
39
+
40
+ /** @type {boolean} - Whether to show as an outline */
41
+ outline = false,
42
+
43
+ /** @type {boolean} - Whether to add a subtle pulse animation */
44
+ pulse = false,
45
+
46
+ /** @type {boolean} - Whether to hide when content is empty */
47
+ hideEmpty = false,
48
+
49
+ /** @type {boolean} - Whether to position as an absolute overlay */
50
+ overlay = false,
51
+
52
+ /** @type {string} - Position when used as overlay (top-right, top-left, etc.) */
53
+ position = "top-right",
54
+
55
+ children,
56
+ } = $props()
57
+
58
+ // Determine if badge should be hidden
59
+ const isEmpty = $derived(!children || children().toString().trim() === "")
60
+ const isHidden = $derived(hideEmpty && isEmpty)
61
+
62
+ // Determine variant classes
63
+ const variantClasses = $derived(
64
+ {
65
+ default: "bg-muted/20 text-muted dark:bg-muted/20 dark:text-muted",
66
+ primary: "bg-primary-500 text-white dark:bg-primary-500 dark:text-white",
67
+ secondary: "bg-secondary-500 text-white dark:bg-secondary-500 dark:text-white",
68
+ success: "bg-success-500 text-white dark:bg-success-500 dark:text-white",
69
+ warning: "bg-warning-500 text-white dark:bg-warning-500 dark:text-white",
70
+ error: "bg-error-500 text-white dark:bg-error-500 dark:text-white",
71
+ info: "bg-info-500 text-white dark:bg-info-500 dark:text-white",
72
+ }[variant] || "bg-muted/20 text-muted dark:bg-muted/20 dark:text-muted"
73
+ )
74
+
75
+ // Determine outline variant classes
76
+ const outlineClasses = $derived(
77
+ outline
78
+ ? {
79
+ default: "bg-transparent border border-muted text-muted dark:border-muted dark:text-muted",
80
+ primary:
81
+ "bg-transparent border border-primary-500 text-primary-500 dark:border-primary-500 dark:text-primary-500",
82
+ secondary:
83
+ "bg-transparent border border-secondary-500 text-secondary-500 dark:border-secondary-500 dark:text-secondary-500",
84
+ success:
85
+ "bg-transparent border border-success-500 text-success-500 dark:border-success-500 dark:text-success-500",
86
+ warning:
87
+ "bg-transparent border border-warning-500 text-warning-500 dark:border-warning-500 dark:text-warning-500",
88
+ error:
89
+ "bg-transparent border border-error-500 text-error-500 dark:border-error-500 dark:text-error-500",
90
+ info: "bg-transparent border border-info-500 text-info-500 dark:border-info-500 dark:text-info-500",
91
+ }[variant]
92
+ : ""
93
+ )
94
+
95
+ // Determine size classes
96
+ const sizeClasses = $derived(
97
+ {
98
+ sm: "text-xs px-1.5 py-0.5 min-w-4 h-4",
99
+ md: "text-xs px-2 py-0.5 min-w-5 h-5",
100
+ lg: "text-sm px-2.5 py-0.5 min-w-6 h-6",
101
+ }[size] || "text-xs px-2 py-0.5 min-w-5 h-5"
102
+ )
103
+
104
+ // Determine dot size classes
105
+ const dotSizeClasses = $derived(
106
+ {
107
+ sm: "w-2 h-2",
108
+ md: "w-2.5 h-2.5",
109
+ lg: "w-3 h-3",
110
+ }[size] || "w-2.5 h-2.5"
111
+ )
112
+
113
+ // Determine position classes for overlay
114
+ const positionClasses = $derived(
115
+ overlay
116
+ ? {
117
+ "top-right": "absolute -top-1 -right-1",
118
+ "top-left": "absolute -top-1 -left-1",
119
+ "bottom-right": "absolute -bottom-1 -right-1",
120
+ "bottom-left": "absolute -bottom-1 -left-1",
121
+ }[position] || "absolute -top-1 -right-1"
122
+ : ""
123
+ )
124
+ </script>
125
+
126
+ {#if !isHidden}
127
+ <span
128
+ {id}
129
+ class="
130
+ badge
131
+ {dot ? 'badge-dot' : ''}
132
+ {pill ? 'badge-pill' : ''}
133
+ {pulse ? 'badge-pulse' : ''}
134
+ {overlay ? 'badge-overlay' : ''}
135
+ {outline ? outlineClasses : variantClasses}
136
+ {dot ? dotSizeClasses : sizeClasses}
137
+ {positionClasses}
138
+ {className}
139
+ "
140
+ role={dot ? 'status' : 'status'}
141
+ aria-label={dot ? 'Status indicator' : undefined}
142
+ >
143
+ {#if !dot}
144
+ {@render children?.()}
145
+ {/if}
146
+ </span>
147
+ {/if}
148
+
149
+ <style>
150
+ @reference "../../twintrinsic.css";
151
+
152
+ .badge {
153
+ @apply inline-flex items-center justify-center;
154
+ @apply font-medium leading-none;
155
+ @apply rounded;
156
+ }
157
+
158
+ .badge-pill {
159
+ @apply rounded-full;
160
+ }
161
+
162
+ .badge-dot {
163
+ @apply rounded-full;
164
+ @apply flex-shrink-0;
165
+ }
166
+
167
+ .badge-overlay {
168
+ @apply z-10;
169
+ }
170
+
171
+ .badge-pulse {
172
+ animation: badge-pulse 1.5s infinite;
173
+ }
174
+
175
+ @keyframes badge-pulse {
176
+ 0% {
177
+ box-shadow: 0 0 0 0 rgba(var(--color-primary-500-rgb), 0.4);
178
+ }
179
+ 70% {
180
+ box-shadow: 0 0 0 6px rgba(var(--color-primary-500-rgb), 0);
181
+ }
182
+ 100% {
183
+ box-shadow: 0 0 0 0 rgba(var(--color-primary-500-rgb), 0);
184
+ }
185
+ }
186
+ </style>
@@ -0,0 +1,51 @@
1
+ export default Badge;
2
+ type Badge = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ /**
7
+ * Badge - A component for displaying small counts, status indicators, or labels.
8
+ * Provides consistent styling, accessibility features, and various display options.
9
+ *
10
+ * Usage:
11
+ * ```svelte
12
+ * <Badge>New</Badge>
13
+ *
14
+ * <Badge variant="primary" size="lg">42</Badge>
15
+ *
16
+ * <Badge variant="success" dot>Online</Badge>
17
+ *
18
+ * <Button>
19
+ * Notifications
20
+ * <Badge variant="error">5</Badge>
21
+ * </Button>
22
+ * ```
23
+ */
24
+ declare const Badge: import("svelte").Component<{
25
+ class?: string;
26
+ id?: any;
27
+ variant?: string;
28
+ size?: string;
29
+ dot?: boolean;
30
+ pill?: boolean;
31
+ outline?: boolean;
32
+ pulse?: boolean;
33
+ hideEmpty?: boolean;
34
+ overlay?: boolean;
35
+ position?: string;
36
+ children: any;
37
+ }, {}, "">;
38
+ type $$ComponentProps = {
39
+ class?: string;
40
+ id?: any;
41
+ variant?: string;
42
+ size?: string;
43
+ dot?: boolean;
44
+ pill?: boolean;
45
+ outline?: boolean;
46
+ pulse?: boolean;
47
+ hideEmpty?: boolean;
48
+ overlay?: boolean;
49
+ position?: string;
50
+ children: any;
51
+ };
@@ -0,0 +1,146 @@
1
+ <!--
2
+ @component
3
+ BottomBar - A collapsible bottom panel that attaches to its parent container.
4
+ Built on top of the Panel component with additional positioning and animation features.
5
+
6
+ Usage:
7
+ ```svelte
8
+ <BottomBar>
9
+ <svelte:fragment slot="header">Details</svelte:fragment>
10
+ Content here
11
+ </BottomBar>
12
+
13
+ <BottomBar expanded={false} height="20rem">
14
+ <svelte:fragment slot="header">Console</svelte:fragment>
15
+ Console output here
16
+ </BottomBar>
17
+ ```
18
+ -->
19
+ <script lang="ts">
20
+ import { slide } from "svelte/transition"
21
+ import Panel from "../Panel/Panel.svelte"
22
+
23
+ type BottomBarProps = {
24
+ expanded?: boolean
25
+ class?: string
26
+ height?: string
27
+ id?: string
28
+ ariaLabel?: string
29
+ disabled?: boolean
30
+ floatOnMobile?: boolean
31
+ docked?: boolean
32
+ ontoggle?: (payload: { expanded: boolean }) => void
33
+ }
34
+
35
+ const {
36
+ expanded = true,
37
+ class: className = "",
38
+ height = "16rem",
39
+ id = crypto.randomUUID(),
40
+ ariaLabel,
41
+ disabled = false,
42
+ floatOnMobile = true,
43
+ docked = false,
44
+ ontoggle,
45
+ } = $props() satisfies BottomBarProps
46
+
47
+ let isExpanded = $state(false)
48
+ let bottomBarElement = $state()
49
+
50
+ // Initialize and sync expanded state when prop changes
51
+ $effect(() => {
52
+ isExpanded = expanded
53
+ })
54
+
55
+ // Handle toggle from Panel
56
+ function handleToggle(payload: { expanded: boolean }) {
57
+ isExpanded = payload.expanded
58
+ ontoggle?.({ expanded: isExpanded })
59
+ }
60
+
61
+ // Handle escape key
62
+ function handleKeydown(event: KeyboardEvent) {
63
+ if (!disabled && event.key === "Escape" && isExpanded) {
64
+ isExpanded = false
65
+ ontoggle?.({ expanded: isExpanded })
66
+ }
67
+ }
68
+ </script>
69
+
70
+ <svelte:window onkeydown={handleKeydown} />
71
+
72
+ <div
73
+ class="
74
+ bottombar-container
75
+ {docked ? 'bottombar-docked' : ''}
76
+ {floatOnMobile ? 'bottombar-float-mobile' : ''}
77
+ {className}
78
+ "
79
+ style="--bottombar-height: {height}"
80
+ {id}
81
+ role="complementary"
82
+ aria-label={ariaLabel}
83
+ >
84
+ <div
85
+ class="
86
+ bottombar
87
+ {isExpanded ? 'bottombar-expanded' : 'bottombar-collapsed'}
88
+ "
89
+ role="region"
90
+ aria-labelledby="{id}-header"
91
+ >
92
+ <Panel
93
+ expanded={isExpanded}
94
+ {disabled}
95
+ bordered={false}
96
+ ontoggle={handleToggle}
97
+ >
98
+ <svelte:fragment slot="header">
99
+ <slot name="header" />
100
+ </svelte:fragment>
101
+ <slot />
102
+ </Panel>
103
+ </div>
104
+ </div>
105
+
106
+ <style>
107
+ @reference "../../twintrinsic.css";
108
+ .bottombar-container {
109
+ @apply relative w-full;
110
+ }
111
+
112
+ /* Base bottombar styles */
113
+ .bottombar {
114
+ @apply bg-background transition-[height,transform] duration-200 ease-in-out overflow-hidden;
115
+ height: var(--bottombar-height);
116
+ }
117
+
118
+ /* Collapsed state */
119
+ .bottombar-collapsed {
120
+ @apply translate-y-full;
121
+ }
122
+
123
+ /* Expanded state */
124
+ .bottombar-expanded {
125
+ @apply translate-y-0;
126
+ }
127
+
128
+ /* Docked styles */
129
+ .bottombar-docked {
130
+ @apply fixed bottom-0 left-0 right-0 z-50;
131
+ }
132
+
133
+ /* Mobile styles */
134
+ @media (max-width: 640px) {
135
+ .bottombar-float-mobile .bottombar {
136
+ @apply fixed bottom-0 left-0 right-0 z-50;
137
+ }
138
+ }
139
+
140
+ /* Non-floating mobile styles */
141
+ @media (max-width: 640px) {
142
+ .bottombar:not(.bottombar-float-mobile) {
143
+ @apply w-full;
144
+ }
145
+ }
146
+ </style>
@@ -0,0 +1,38 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ /**
15
+ * BottomBar - A collapsible bottom panel that attaches to its parent container.
16
+ * Built on top of the Panel component with additional positioning and animation features.
17
+ *
18
+ * Usage:
19
+ * ```svelte
20
+ * <BottomBar>
21
+ * <svelte:fragment slot="header">Details</svelte:fragment>
22
+ * Content here
23
+ * </BottomBar>
24
+ *
25
+ * <BottomBar expanded={false} height="20rem">
26
+ * <svelte:fragment slot="header">Console</svelte:fragment>
27
+ * Console output here
28
+ * </BottomBar>
29
+ * ```
30
+ */
31
+ declare const BottomBar: $$__sveltets_2_IsomorphicComponent<any, {
32
+ [evt: string]: CustomEvent<any>;
33
+ }, {
34
+ header: {};
35
+ default: {};
36
+ }, {}, "">;
37
+ type BottomBar = InstanceType<typeof BottomBar>;
38
+ export default BottomBar;
@@ -0,0 +1,77 @@
1
+ <!--
2
+ @component
3
+ Breadcrumb - A navigation component that helps users understand their location in a website or application.
4
+ Provides a hierarchical trail of links with proper accessibility features.
5
+
6
+ Usage:
7
+ ```svelte
8
+ <Breadcrumb>
9
+ <BreadcrumbItem href="/">Home</BreadcrumbItem>
10
+ <BreadcrumbItem href="/products">Products</BreadcrumbItem>
11
+ <BreadcrumbItem>Current Page</BreadcrumbItem>
12
+ </Breadcrumb>
13
+
14
+ <Breadcrumb separator="/">
15
+ <BreadcrumbItem href="/">Home</BreadcrumbItem>
16
+ <BreadcrumbItem href="/docs">Documentation</BreadcrumbItem>
17
+ <BreadcrumbItem>Components</BreadcrumbItem>
18
+ </Breadcrumb>
19
+ ```
20
+ -->
21
+ <script>
22
+ import { setContext } from "svelte"
23
+
24
+ const {
25
+ /** @type {string} - Additional CSS classes */
26
+ class: className = "",
27
+
28
+ /** @type {string} - HTML id for accessibility */
29
+ id = crypto.randomUUID(),
30
+
31
+ /** @type {string} - Separator character or HTML between items */
32
+ separator = "/",
33
+
34
+ /** @type {string} - ARIA label for the breadcrumb */
35
+ ariaLabel = "Breadcrumb",
36
+
37
+ /** @type {boolean} - Whether to collapse long breadcrumbs with ellipsis */
38
+ collapsible = false,
39
+
40
+ /** @type {number} - Maximum visible items when collapsed (excluding first and last) */
41
+ maxVisibleItems = 1,
42
+
43
+ children,
44
+ } = $props()
45
+
46
+ // Provide context for child components
47
+ $effect(() => {
48
+ const breadcrumbContext = {
49
+ separator,
50
+ collapsible,
51
+ maxVisibleItems,
52
+ }
53
+ setContext("breadcrumb", breadcrumbContext)
54
+ })
55
+ </script>
56
+
57
+ <nav
58
+ {id}
59
+ class="breadcrumb {className}"
60
+ aria-label={ariaLabel}
61
+ >
62
+ <ol class="breadcrumb-list">
63
+ {@render children?.()}
64
+ </ol>
65
+ </nav>
66
+
67
+ <style>
68
+ @reference "../../twintrinsic.css";
69
+
70
+ .breadcrumb {
71
+ @apply w-full;
72
+ }
73
+
74
+ .breadcrumb-list {
75
+ @apply flex flex-wrap items-center;
76
+ }
77
+ </style>
@@ -0,0 +1,42 @@
1
+ export default Breadcrumb;
2
+ type Breadcrumb = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ /**
7
+ * Breadcrumb - A navigation component that helps users understand their location in a website or application.
8
+ * Provides a hierarchical trail of links with proper accessibility features.
9
+ *
10
+ * Usage:
11
+ * ```svelte
12
+ * <Breadcrumb>
13
+ * <BreadcrumbItem href="/">Home</BreadcrumbItem>
14
+ * <BreadcrumbItem href="/products">Products</BreadcrumbItem>
15
+ * <BreadcrumbItem>Current Page</BreadcrumbItem>
16
+ * </Breadcrumb>
17
+ *
18
+ * <Breadcrumb separator="/">
19
+ * <BreadcrumbItem href="/">Home</BreadcrumbItem>
20
+ * <BreadcrumbItem href="/docs">Documentation</BreadcrumbItem>
21
+ * <BreadcrumbItem>Components</BreadcrumbItem>
22
+ * </Breadcrumb>
23
+ * ```
24
+ */
25
+ declare const Breadcrumb: import("svelte").Component<{
26
+ class?: string;
27
+ id?: any;
28
+ separator?: string;
29
+ ariaLabel?: string;
30
+ collapsible?: boolean;
31
+ maxVisibleItems?: number;
32
+ children: any;
33
+ }, {}, "">;
34
+ type $$ComponentProps = {
35
+ class?: string;
36
+ id?: any;
37
+ separator?: string;
38
+ ariaLabel?: string;
39
+ collapsible?: boolean;
40
+ maxVisibleItems?: number;
41
+ children: any;
42
+ };
@@ -0,0 +1,171 @@
1
+ <!--
2
+ @component
3
+ BreadcrumbItem - An individual item within a Breadcrumb component.
4
+ Renders as a link when href is provided, otherwise as a span for the current page.
5
+
6
+ Usage:
7
+ ```svelte
8
+ <BreadcrumbItem href="/">Home</BreadcrumbItem>
9
+
10
+ <BreadcrumbItem href="/products" icon="<svg>...</svg>">
11
+ Products
12
+ </BreadcrumbItem>
13
+
14
+ <BreadcrumbItem>Current Page</BreadcrumbItem>
15
+ ```
16
+ -->
17
+ <script>
18
+ import { getContext, onMount } from "svelte"
19
+
20
+ const {
21
+ /** @type {string} - Additional CSS classes */
22
+ class: className = "",
23
+
24
+ /** @type {string} - Link URL (if item is a link) */
25
+ href,
26
+
27
+ /** @type {string} - Link target (_blank, _self, etc.) */
28
+ target,
29
+
30
+ /** @type {string} - Icon to display (HTML or SVG string) */
31
+ icon,
32
+
33
+ /** @type {boolean} - Whether this is the current/active page */
34
+ current = false,
35
+
36
+ /** @type {boolean} - Whether this item should be hidden when collapsed */
37
+ collapsible = true,
38
+
39
+ children,
40
+ } = $props()
41
+
42
+ // Get breadcrumb context
43
+ const breadcrumbContext = getContext("breadcrumb")
44
+
45
+ // Get separator from context
46
+ const separator = breadcrumbContext?.separator || "/"
47
+
48
+ // Component state
49
+ let itemElement
50
+ let index = $state(-1)
51
+ let isVisible = $state(true)
52
+
53
+ // Register with parent on mount
54
+ onMount(() => {
55
+ if (itemElement) {
56
+ // Find our index among siblings
57
+ const parent = itemElement.parentElement
58
+ if (parent) {
59
+ const items = Array.from(parent.children)
60
+ index = items.indexOf(itemElement)
61
+
62
+ // Check if we should be visible based on collapsible settings
63
+ if (breadcrumbContext?.collapsible && collapsible) {
64
+ const maxVisible = breadcrumbContext.maxVisibleItems || 1
65
+ const totalItems = items.length
66
+
67
+ // Always show first and last items
68
+ if (index === 0 || index === totalItems - 1) {
69
+ isVisible = true
70
+ } else {
71
+ // For middle items, only show up to maxVisible
72
+ const middleItems = totalItems - 2 // excluding first and last
73
+
74
+ if (middleItems <= maxVisible) {
75
+ // If we have fewer middle items than max, show all
76
+ isVisible = true
77
+ } else {
78
+ // Otherwise, only show the first maxVisible middle items
79
+ isVisible = index <= maxVisible
80
+ }
81
+ }
82
+ }
83
+ }
84
+ }
85
+ })
86
+
87
+ // Determine if this is the last item
88
+ const isLast = $derived(index === -1 || !itemElement?.nextElementSibling)
89
+
90
+ // Determine if this is the current page
91
+ const isCurrent = $derived(current || isLast)
92
+ </script>
93
+
94
+ <li
95
+ class="
96
+ breadcrumb-item
97
+ {isCurrent ? 'breadcrumb-item-current' : ''}
98
+ {isVisible ? '' : 'breadcrumb-item-hidden'}
99
+ {className}
100
+ "
101
+ aria-current={isCurrent ? 'page' : undefined}
102
+ bind:this={itemElement}
103
+ >
104
+ {#if href && !isCurrent}
105
+ <a
106
+ {href}
107
+ {target}
108
+ class="breadcrumb-link"
109
+ >
110
+ {#if icon}
111
+ <span class="breadcrumb-icon" aria-hidden="true">
112
+ {@html icon}
113
+ </span>
114
+ {/if}
115
+ <span class="breadcrumb-text">
116
+ {@render children?.()}
117
+ </span>
118
+ </a>
119
+ {:else}
120
+ <span class="breadcrumb-text">
121
+ {#if icon}
122
+ <span class="breadcrumb-icon" aria-hidden="true">
123
+ {@html icon}
124
+ </span>
125
+ {/if}
126
+ {@render children?.()}
127
+ </span>
128
+ {/if}
129
+
130
+ {#if !isLast}
131
+ <span class="breadcrumb-separator" aria-hidden="true">
132
+ {@html separator}
133
+ </span>
134
+ {/if}
135
+ </li>
136
+
137
+ <style>
138
+ @reference "../../twintrinsic.css";
139
+
140
+ .breadcrumb-item {
141
+ @apply flex items-center;
142
+ }
143
+
144
+ .breadcrumb-item-hidden {
145
+ @apply hidden;
146
+ }
147
+
148
+ .breadcrumb-link {
149
+ @apply inline-flex items-center;
150
+ @apply text-primary-600 dark:text-primary-400;
151
+ @apply hover:text-primary-700 dark:hover:text-primary-300 hover:underline;
152
+ @apply focus:outline-none focus:ring-2 focus:ring-primary-500 dark:focus:ring-primary-400 focus:ring-offset-2 rounded-sm;
153
+ @apply transition-colors duration-150;
154
+ }
155
+
156
+ .breadcrumb-text {
157
+ @apply inline-flex items-center;
158
+ }
159
+
160
+ .breadcrumb-item-current .breadcrumb-text {
161
+ @apply font-medium text-text dark:text-text;
162
+ }
163
+
164
+ .breadcrumb-separator {
165
+ @apply mx-2 text-muted dark:text-muted;
166
+ }
167
+
168
+ .breadcrumb-icon {
169
+ @apply mr-1 w-4 h-4;
170
+ }
171
+ </style>