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,99 @@
1
+ <!--
2
+ @component
3
+ TableRow - A component for a row within a Table.
4
+ Provides consistent styling for table rows with selection and hover states.
5
+
6
+ Usage:
7
+ ```svelte
8
+ <TableRow>
9
+ <TableCell>John Doe</TableCell>
10
+ <TableCell>john@example.com</TableCell>
11
+ </TableRow>
12
+
13
+ <TableRow selected>
14
+ <TableCell>Selected Row</TableCell>
15
+ <TableCell>Data</TableCell>
16
+ </TableRow>
17
+ ```
18
+ -->
19
+ <script>
20
+ import { getContext } from "svelte"
21
+
22
+ const {
23
+ /** @type {string} - Additional CSS classes */
24
+ class: className = "",
25
+
26
+ /** @type {boolean} - Whether the row is selected */
27
+ selected = false,
28
+
29
+ /** @type {boolean} - Whether the row is disabled */
30
+ disabled = false,
31
+
32
+ /** @type {boolean} - Whether the row is clickable */
33
+ clickable = false,
34
+
35
+ /** @type {any} - Data associated with the row */
36
+ data,
37
+
38
+ /** @type {(event: CustomEvent) => void} - Click event handler */
39
+ onclick,
40
+
41
+ children,
42
+
43
+ /** @type {object} - Additional props to pass to the input element */
44
+ ...restProps
45
+ } = $props()
46
+
47
+ // Get table context if available
48
+ const tableContext = getContext("table")
49
+
50
+ // Determine if table has hover effect
51
+ const hoverable = tableContext?.hoverable || false
52
+
53
+ /**
54
+ * Handles row click
55
+ * @param {MouseEvent} event - Click event
56
+ */
57
+ function handleClick(event) {
58
+ if (disabled) return
59
+
60
+ onclick?.(new CustomEvent("click", { detail: { event, row: data } }))
61
+ }
62
+ </script>
63
+
64
+ <tr
65
+ class="
66
+ table-row
67
+ {selected ? 'table-row-selected' : ''}
68
+ {disabled ? 'table-row-disabled' : ''}
69
+ {clickable || restProps?.onclick ? 'table-row-clickable' : ''}
70
+ {hoverable ? 'table-row-hoverable' : ''}
71
+ {className}
72
+ "
73
+ aria-selected={selected ? 'true' : undefined}
74
+ aria-disabled={disabled ? 'true' : undefined}
75
+ onclick={handleClick}
76
+ {...restProps}
77
+ >
78
+ {@render children?.()}
79
+ </tr>
80
+
81
+ <style>
82
+ @reference "../../twintrinsic.css";
83
+
84
+ .table-row-selected {
85
+ @apply bg-primary-50 dark:bg-primary-900/20;
86
+ }
87
+
88
+ .table-row-disabled {
89
+ @apply opacity-50 cursor-not-allowed;
90
+ }
91
+
92
+ .table-row-clickable {
93
+ @apply cursor-pointer;
94
+ }
95
+
96
+ .table-row-hoverable {
97
+ @apply hover:bg-hover dark:hover:bg-hover transition-colors duration-150;
98
+ }
99
+ </style>
@@ -0,0 +1,40 @@
1
+ export default TableRow;
2
+ type TableRow = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ /**
7
+ * TableRow - A component for a row within a Table.
8
+ * Provides consistent styling for table rows with selection and hover states.
9
+ *
10
+ * Usage:
11
+ * ```svelte
12
+ * <TableRow>
13
+ * <TableCell>John Doe</TableCell>
14
+ * <TableCell>john@example.com</TableCell>
15
+ * </TableRow>
16
+ *
17
+ * <TableRow selected>
18
+ * <TableCell>Selected Row</TableCell>
19
+ * <TableCell>Data</TableCell>
20
+ * </TableRow>
21
+ * ```
22
+ */
23
+ declare const TableRow: import("svelte").Component<{
24
+ class?: string;
25
+ selected?: boolean;
26
+ disabled?: boolean;
27
+ clickable?: boolean;
28
+ data: any;
29
+ onclick: any;
30
+ children: any;
31
+ } & Record<string, any>, {}, "">;
32
+ type $$ComponentProps = {
33
+ class?: string;
34
+ selected?: boolean;
35
+ disabled?: boolean;
36
+ clickable?: boolean;
37
+ data: any;
38
+ onclick: any;
39
+ children: any;
40
+ } & Record<string, any>;
@@ -0,0 +1,145 @@
1
+ <!--
2
+ @component
3
+ Tab - An individual tab button within a TabList component.
4
+ Provides the clickable interface for selecting tab panels.
5
+
6
+ Usage:
7
+ ```svelte
8
+ <Tab>Tab Label</Tab>
9
+
10
+ <Tab disabled>Disabled Tab</Tab>
11
+
12
+ <Tab icon="<svg>...</svg>">
13
+ Tab with Icon
14
+ </Tab>
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} - HTML id for accessibility */
25
+ id,
26
+
27
+ /** @type {boolean} - Whether the tab is disabled */
28
+ disabled = false,
29
+
30
+ /** @type {string} - Icon to display (HTML or SVG string) */
31
+ icon,
32
+
33
+ /** @type {string} - Icon position (left or right) */
34
+ iconPosition = "left",
35
+
36
+ children,
37
+ } = $props()
38
+
39
+ // Get tabs context
40
+ const tabsContext = getContext("tabs")
41
+
42
+ if (!tabsContext) {
43
+ throw new Error("Tab must be used within a Tabs component")
44
+ }
45
+
46
+ // Tab state
47
+ let tabElement
48
+ let index = -1
49
+
50
+ // Register tab on mount
51
+ onMount(() => {
52
+ if (tabElement) {
53
+ index = tabsContext.registerTab(tabElement)
54
+ }
55
+
56
+ return () => {
57
+ // Cleanup if needed
58
+ }
59
+ })
60
+
61
+ // Determine if this tab is selected
62
+ const isSelected = $derived(tabsContext.selectedIndex() === index)
63
+
64
+ // Determine if tabs are disabled from parent
65
+ const isDisabled = $derived(disabled || tabsContext.disabled())
66
+
67
+ /**
68
+ * Handles tab click
69
+ */
70
+ function handleClick() {
71
+ if (isDisabled) return
72
+
73
+ tabsContext.selectTab(index)
74
+ }
75
+
76
+ /**
77
+ * Handles tab keydown
78
+ * @param {KeyboardEvent} event - Keydown event
79
+ */
80
+ function handleKeydown(event) {
81
+ if (isDisabled) return
82
+
83
+ tabsContext.handleKeydown(event, index)
84
+ }
85
+
86
+ // Generate unique ID if not provided
87
+ const tabId = id || `tab-${crypto.randomUUID()}`
88
+
89
+ // Panel ID for aria-controls
90
+ const panelId = $derived(`panel-${tabId}`)
91
+ </script>
92
+
93
+ <button
94
+ id={tabId}
95
+ class="tab {className}"
96
+ role="tab"
97
+ aria-selected={isSelected}
98
+ aria-controls={panelId}
99
+ tabindex={isSelected ? 0 : -1}
100
+ {disabled}
101
+ onclick={handleClick}
102
+ onkeydown={handleKeydown}
103
+ bind:this={tabElement}
104
+ >
105
+ {#if icon && iconPosition === 'left'}
106
+ <span class="tab-icon tab-icon-left" aria-hidden="true">
107
+ {@html icon}
108
+ </span>
109
+ {/if}
110
+
111
+ <span class="tab-content">
112
+ {@render children?.()}
113
+ </span>
114
+
115
+ {#if icon && iconPosition === 'right'}
116
+ <span class="tab-icon tab-icon-right" aria-hidden="true">
117
+ {@html icon}
118
+ </span>
119
+ {/if}
120
+ </button>
121
+
122
+ <style>
123
+ @reference "../../twintrinsic.css";
124
+
125
+ .tab {
126
+ @apply inline-flex items-center justify-center;
127
+ @apply font-medium text-muted dark:text-muted;
128
+ @apply transition-colors duration-200;
129
+ @apply focus:outline-none focus:ring-2 focus:ring-primary-500 dark:focus:ring-primary-400;
130
+ @apply disabled:opacity-50 disabled:cursor-not-allowed;
131
+ @apply whitespace-nowrap;
132
+ }
133
+
134
+ .tab-content {
135
+ @apply flex-grow;
136
+ }
137
+
138
+ .tab-icon-left {
139
+ @apply mr-2;
140
+ }
141
+
142
+ .tab-icon-right {
143
+ @apply ml-2;
144
+ }
145
+ </style>
@@ -0,0 +1,36 @@
1
+ export default Tab;
2
+ type Tab = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ /**
7
+ * Tab - An individual tab button within a TabList component.
8
+ * Provides the clickable interface for selecting tab panels.
9
+ *
10
+ * Usage:
11
+ * ```svelte
12
+ * <Tab>Tab Label</Tab>
13
+ *
14
+ * <Tab disabled>Disabled Tab</Tab>
15
+ *
16
+ * <Tab icon="<svg>...</svg>">
17
+ * Tab with Icon
18
+ * </Tab>
19
+ * ```
20
+ */
21
+ declare const Tab: import("svelte").Component<{
22
+ class?: string;
23
+ id: any;
24
+ disabled?: boolean;
25
+ icon: any;
26
+ iconPosition?: string;
27
+ children: any;
28
+ }, {}, "">;
29
+ type $$ComponentProps = {
30
+ class?: string;
31
+ id: any;
32
+ disabled?: boolean;
33
+ icon: any;
34
+ iconPosition?: string;
35
+ children: any;
36
+ };
@@ -0,0 +1,60 @@
1
+ <!--
2
+ @component
3
+ TabList - A container for Tab components within a Tabs component.
4
+ Provides the navigation interface for tab panels.
5
+
6
+ Usage:
7
+ ```svelte
8
+ <Tabs>
9
+ <TabList>
10
+ <Tab>First Tab</Tab>
11
+ <Tab>Second Tab</Tab>
12
+ </TabList>
13
+
14
+ <TabPanel>First tab content</TabPanel>
15
+ <TabPanel>Second tab content</TabPanel>
16
+ </Tabs>
17
+ ```
18
+ -->
19
+ <script>
20
+ import { getContext } from "svelte"
21
+
22
+ const {
23
+ /** @type {string} - Additional CSS classes */
24
+ class: className = "",
25
+
26
+ /** @type {string} - ARIA label for the tablist */
27
+ ariaLabel,
28
+
29
+ children,
30
+ } = $props()
31
+
32
+ // Get tabs context
33
+ const tabsContext = getContext("tabs")
34
+
35
+ // Get context values with defaults
36
+ const centered = tabsContext?.centered || false
37
+ const fullWidth = tabsContext?.fullWidth || false
38
+ </script>
39
+
40
+ <div
41
+ class="
42
+ tab-list
43
+ {fullWidth ? 'w-full' : ''}
44
+ {centered ? 'justify-center' : ''}
45
+ {className}
46
+ "
47
+ role="tablist"
48
+ aria-label={ariaLabel}
49
+ >
50
+ {@render children?.()}
51
+ </div>
52
+
53
+ <style>
54
+ @reference "../../twintrinsic.css";
55
+
56
+ .tab-list {
57
+ @apply flex items-center;
58
+ @apply overflow-x-auto;
59
+ }
60
+ </style>
@@ -0,0 +1,32 @@
1
+ export default TabList;
2
+ type TabList = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ /**
7
+ * TabList - A container for Tab components within a Tabs component.
8
+ * Provides the navigation interface for tab panels.
9
+ *
10
+ * Usage:
11
+ * ```svelte
12
+ * <Tabs>
13
+ * <TabList>
14
+ * <Tab>First Tab</Tab>
15
+ * <Tab>Second Tab</Tab>
16
+ * </TabList>
17
+ *
18
+ * <TabPanel>First tab content</TabPanel>
19
+ * <TabPanel>Second tab content</TabPanel>
20
+ * </Tabs>
21
+ * ```
22
+ */
23
+ declare const TabList: import("svelte").Component<{
24
+ class?: string;
25
+ ariaLabel: any;
26
+ children: any;
27
+ }, {}, "">;
28
+ type $$ComponentProps = {
29
+ class?: string;
30
+ ariaLabel: any;
31
+ children: any;
32
+ };
@@ -0,0 +1,118 @@
1
+ <!--
2
+ @component
3
+ TabPanel - A container for tab content within a Tabs component.
4
+ Displays content when its corresponding Tab is selected.
5
+
6
+ Usage:
7
+ ```svelte
8
+ <TabPanel>
9
+ Content for the first tab
10
+ </TabPanel>
11
+
12
+ <TabPanel lazy>
13
+ This content only renders when the tab is selected
14
+ </TabPanel>
15
+ ```
16
+ -->
17
+ <script>
18
+ import { getContext, onMount } from "svelte"
19
+ import { fade } from "svelte/transition"
20
+
21
+ const {
22
+ /** @type {string} - Additional CSS classes */
23
+ class: className = "",
24
+
25
+ /** @type {string} - HTML id for accessibility */
26
+ id,
27
+
28
+ /** @type {boolean} - Whether to lazy load panel content */
29
+ lazy = false,
30
+
31
+ /** @type {boolean} - Whether to keep content in DOM when not visible */
32
+ keepAlive = true,
33
+
34
+ /** @type {boolean} - Whether to animate panel transitions */
35
+ animated = true,
36
+
37
+ /** @type {number} - Animation duration in ms */
38
+ animationDuration = 200,
39
+
40
+ children,
41
+ } = $props()
42
+
43
+ // Get tabs context
44
+ const tabsContext = getContext("tabs")
45
+
46
+ if (!tabsContext) {
47
+ throw new Error("TabPanel must be used within a Tabs component")
48
+ }
49
+
50
+ // Panel state
51
+ let panelElement
52
+ let index = -1
53
+ let hasBeenSelected = $state(false)
54
+
55
+ // Register panel on mount
56
+ onMount(() => {
57
+ if (panelElement) {
58
+ index = tabsContext.registerPanel(panelElement)
59
+ }
60
+
61
+ return () => {
62
+ // Cleanup if needed
63
+ }
64
+ })
65
+
66
+ // Determine if this panel is selected
67
+ const isSelected = $derived(tabsContext.selectedIndex() === index)
68
+
69
+ // Update hasBeenSelected when selected
70
+ $effect(() => {
71
+ if (isSelected) {
72
+ hasBeenSelected = true
73
+ }
74
+ })
75
+
76
+ // Determine if content should be rendered
77
+ const shouldRenderContent = $derived(isSelected || (keepAlive && hasBeenSelected) || !lazy)
78
+
79
+ // Generate unique ID if not provided
80
+ const panelId = id || `panel-${crypto.randomUUID()}`
81
+
82
+ // Tab ID for aria-labelledby
83
+ const tabId = $derived(`tab-${panelId.replace("panel-", "")}`)
84
+ </script>
85
+
86
+ <div
87
+ id={panelId}
88
+ class="tab-panel {className}"
89
+ role="tabpanel"
90
+ aria-labelledby={tabId}
91
+ tabindex="0"
92
+ hidden={!isSelected}
93
+ bind:this={panelElement}
94
+ >
95
+ {#if shouldRenderContent}
96
+ {#if animated && isSelected}
97
+ <div transition:fade={{ duration: animationDuration }}>
98
+ {@render children?.()}
99
+ </div>
100
+ {:else}
101
+ <div>
102
+ {@render children?.()}
103
+ </div>
104
+ {/if}
105
+ {/if}
106
+ </div>
107
+
108
+ <style>
109
+ @reference "../../twintrinsic.css";
110
+
111
+ .tab-panel {
112
+ @apply w-full py-4 focus:outline-none;
113
+ }
114
+
115
+ .tab-panel[hidden] {
116
+ @apply hidden;
117
+ }
118
+ </style>
@@ -0,0 +1,38 @@
1
+ export default TabPanel;
2
+ type TabPanel = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ /**
7
+ * TabPanel - A container for tab content within a Tabs component.
8
+ * Displays content when its corresponding Tab is selected.
9
+ *
10
+ * Usage:
11
+ * ```svelte
12
+ * <TabPanel>
13
+ * Content for the first tab
14
+ * </TabPanel>
15
+ *
16
+ * <TabPanel lazy>
17
+ * This content only renders when the tab is selected
18
+ * </TabPanel>
19
+ * ```
20
+ */
21
+ declare const TabPanel: import("svelte").Component<{
22
+ class?: string;
23
+ id: any;
24
+ lazy?: boolean;
25
+ keepAlive?: boolean;
26
+ animated?: boolean;
27
+ animationDuration?: number;
28
+ children: any;
29
+ }, {}, "">;
30
+ type $$ComponentProps = {
31
+ class?: string;
32
+ id: any;
33
+ lazy?: boolean;
34
+ keepAlive?: boolean;
35
+ animated?: boolean;
36
+ animationDuration?: number;
37
+ children: any;
38
+ };