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.
- package/LICENSE +674 -0
- package/README.md +150 -0
- package/dist/App/App.svelte +54 -0
- package/dist/App/App.svelte.d.ts +65 -0
- package/dist/Section.svelte +25 -0
- package/dist/Section.svelte.d.ts +34 -0
- package/dist/actions/clickOutside.d.ts +9 -0
- package/dist/actions/clickOutside.js +19 -0
- package/dist/actions/index.d.ts +1 -0
- package/dist/actions/index.js +1 -0
- package/dist/components/Accordion/Accordion.svelte +75 -0
- package/dist/components/Accordion/Accordion.svelte.d.ts +39 -0
- package/dist/components/Accordion/AccordionItem.svelte +150 -0
- package/dist/components/Accordion/AccordionItem.svelte.d.ts +30 -0
- package/dist/components/App/App.story.md +8 -0
- package/dist/components/App/App.story.svelte +170 -0
- package/dist/components/App/App.story.svelte.d.ts +22 -0
- package/dist/components/App/App.svelte +77 -0
- package/dist/components/App/App.svelte.d.ts +66 -0
- package/dist/components/App/Split.svelte +346 -0
- package/dist/components/App/Split.svelte.d.ts +54 -0
- package/dist/components/App/index.d.ts +2 -0
- package/dist/components/App/index.js +3 -0
- package/dist/components/AppHeader/AppHeader.svelte +439 -0
- package/dist/components/AppHeader/AppHeader.svelte.d.ts +24 -0
- package/dist/components/Avatar/Avatar.svelte +300 -0
- package/dist/components/Avatar/Avatar.svelte.d.ts +48 -0
- package/dist/components/Avatar/AvatarGroup.svelte +185 -0
- package/dist/components/Avatar/AvatarGroup.svelte.d.ts +46 -0
- package/dist/components/Badge/Badge.svelte +186 -0
- package/dist/components/Badge/Badge.svelte.d.ts +51 -0
- package/dist/components/BottomBar/BottomBar.svelte +146 -0
- package/dist/components/BottomBar/BottomBar.svelte.d.ts +38 -0
- package/dist/components/Breadcrumb/Breadcrumb.svelte +77 -0
- package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts +42 -0
- package/dist/components/Breadcrumb/BreadcrumbItem.svelte +171 -0
- package/dist/components/Breadcrumb/BreadcrumbItem.svelte.d.ts +38 -0
- package/dist/components/Button/Button.svelte +252 -0
- package/dist/components/Button/Button.svelte.d.ts +80 -0
- package/dist/components/Button/ButtonGroup.svelte +127 -0
- package/dist/components/Button/ButtonGroup.svelte.d.ts +44 -0
- package/dist/components/Card/Card.svelte +152 -0
- package/dist/components/Card/Card.svelte.d.ts +55 -0
- package/dist/components/Carousel/Carousel.svelte +461 -0
- package/dist/components/Carousel/Carousel.svelte.d.ts +79 -0
- package/dist/components/Carousel/CarouselItem.svelte +149 -0
- package/dist/components/Carousel/CarouselItem.svelte.d.ts +35 -0
- package/dist/components/Chip/Chip.svelte +288 -0
- package/dist/components/Chip/Chip.svelte.d.ts +71 -0
- package/dist/components/Chip/ChipGroup.svelte +190 -0
- package/dist/components/Chip/ChipGroup.svelte.d.ts +71 -0
- package/dist/components/CodeBlock/CodeBlock.svelte +356 -0
- package/dist/components/CodeBlock/CodeBlock.svelte.d.ts +44 -0
- package/dist/components/CodeBlock/index.d.ts +1 -0
- package/dist/components/CodeBlock/index.js +1 -0
- package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte +145 -0
- package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte.d.ts +44 -0
- package/dist/components/CodeEditor/CodeEditor.svelte +229 -0
- package/dist/components/CodeEditor/CodeEditor.svelte.d.ts +23 -0
- package/dist/components/Combobox/Combobox.svelte +279 -0
- package/dist/components/Combobox/Combobox.svelte.d.ts +34 -0
- package/dist/components/Container/Container.svelte +45 -0
- package/dist/components/Container/Container.svelte.d.ts +36 -0
- package/dist/components/DataTable/DataTable.svelte +879 -0
- package/dist/components/DataTable/DataTable.svelte.d.ts +102 -0
- package/dist/components/Form/AutoComplete.svelte +357 -0
- package/dist/components/Form/AutoComplete.svelte.d.ts +73 -0
- package/dist/components/Form/Calendar.svelte +429 -0
- package/dist/components/Form/Calendar.svelte.d.ts +53 -0
- package/dist/components/Form/Checkbox.svelte +196 -0
- package/dist/components/Form/Checkbox.svelte.d.ts +50 -0
- package/dist/components/Form/ColorPicker.svelte +396 -0
- package/dist/components/Form/ColorPicker.svelte.d.ts +43 -0
- package/dist/components/Form/Combobox.svelte +645 -0
- package/dist/components/Form/Combobox.svelte.d.ts +93 -0
- package/dist/components/Form/Dropdown.svelte +773 -0
- package/dist/components/Form/Dropdown.svelte.d.ts +81 -0
- package/dist/components/Form/FileUpload.svelte +796 -0
- package/dist/components/Form/FileUpload.svelte.d.ts +78 -0
- package/dist/components/Form/FloatLabel.svelte +245 -0
- package/dist/components/Form/FloatLabel.svelte.d.ts +44 -0
- package/dist/components/Form/Form.svelte +281 -0
- package/dist/components/Form/Form.svelte.d.ts +54 -0
- package/dist/components/Form/FormField.svelte +218 -0
- package/dist/components/Form/FormField.svelte.d.ts +47 -0
- package/dist/components/Form/Input.svelte +340 -0
- package/dist/components/Form/Input.svelte.d.ts +79 -0
- package/dist/components/Form/InputSwitch.svelte +189 -0
- package/dist/components/Form/InputSwitch.svelte.d.ts +46 -0
- package/dist/components/Form/InvalidState.svelte +97 -0
- package/dist/components/Form/InvalidState.svelte.d.ts +37 -0
- package/dist/components/Form/Knob.svelte +537 -0
- package/dist/components/Form/Knob.svelte.d.ts +78 -0
- package/dist/components/Form/ListInput.svelte +469 -0
- package/dist/components/Form/ListInput.svelte.d.ts +70 -0
- package/dist/components/Form/Listbox.svelte +513 -0
- package/dist/components/Form/Listbox.svelte.d.ts +74 -0
- package/dist/components/Form/NumberInput.svelte +452 -0
- package/dist/components/Form/NumberInput.svelte.d.ts +82 -0
- package/dist/components/Form/Radio.svelte +192 -0
- package/dist/components/Form/Radio.svelte.d.ts +53 -0
- package/dist/components/Form/RadioGroup.svelte +155 -0
- package/dist/components/Form/RadioGroup.svelte.d.ts +48 -0
- package/dist/components/Form/Rating.svelte +380 -0
- package/dist/components/Form/Rating.svelte.d.ts +64 -0
- package/dist/components/Form/Select.svelte +436 -0
- package/dist/components/Form/Select.svelte.d.ts +49 -0
- package/dist/components/Form/SelectGroup.svelte +34 -0
- package/dist/components/Form/SelectGroup.svelte.d.ts +33 -0
- package/dist/components/Form/Slider.svelte +622 -0
- package/dist/components/Form/Slider.svelte.d.ts +73 -0
- package/dist/components/Form/Switch.svelte +192 -0
- package/dist/components/Form/Switch.svelte.d.ts +46 -0
- package/dist/components/Form/TextInput.svelte +274 -0
- package/dist/components/Form/TextInput.svelte.d.ts +74 -0
- package/dist/components/Form/Textarea.svelte +207 -0
- package/dist/components/Form/Textarea.svelte.d.ts +62 -0
- package/dist/components/Icon/Icon.svelte +140 -0
- package/dist/components/Icon/Icon.svelte.d.ts +25 -0
- package/dist/components/Icon/index.d.ts +1 -0
- package/dist/components/Icon/index.js +1 -0
- package/dist/components/Lazy/Lazy.svelte +158 -0
- package/dist/components/Lazy/Lazy.svelte.d.ts +42 -0
- package/dist/components/Masonry/Masonry.svelte +299 -0
- package/dist/components/Masonry/Masonry.svelte.d.ts +55 -0
- package/dist/components/Menu/Menu/Menu.svelte +65 -0
- package/dist/components/Menu/Menu/Menu.svelte.d.ts +17 -0
- package/dist/components/Menu/Menu/MenuItem.svelte +90 -0
- package/dist/components/Menu/Menu/MenuItem.svelte.d.ts +27 -0
- package/dist/components/Modal/Modal.svelte +334 -0
- package/dist/components/Modal/Modal.svelte.d.ts +55 -0
- package/dist/components/Panel/Card.svelte +141 -0
- package/dist/components/Panel/Card.svelte.d.ts +52 -0
- package/dist/components/Panel/Hero/Hero.story.md +9 -0
- package/dist/components/Panel/Hero/Hero.story.svelte +49 -0
- package/dist/components/Panel/Hero/Hero.story.svelte.d.ts +21 -0
- package/dist/components/Panel/Hero/Hero.svelte +24 -0
- package/dist/components/Panel/Hero/Hero.svelte.d.ts +32 -0
- package/dist/components/Panel/LazyPanel.svelte +110 -0
- package/dist/components/Panel/LazyPanel.svelte.d.ts +46 -0
- package/dist/components/Panel/Panel.svelte +205 -0
- package/dist/components/Panel/Panel.svelte.d.ts +23 -0
- package/dist/components/Progress/Progress.svelte +220 -0
- package/dist/components/Progress/Progress.svelte.d.ts +61 -0
- package/dist/components/Separator/Separator.svelte +109 -0
- package/dist/components/Separator/Separator.svelte.d.ts +35 -0
- package/dist/components/Sidebar/Sidebar.svelte +213 -0
- package/dist/components/Sidebar/Sidebar.svelte.d.ts +60 -0
- package/dist/components/Skeleton/Skeleton.svelte +170 -0
- package/dist/components/Skeleton/Skeleton.svelte.d.ts +48 -0
- package/dist/components/Stepper/Stepper.svelte +111 -0
- package/dist/components/Stepper/Stepper.svelte.d.ts +54 -0
- package/dist/components/Stepper/StepperStep.svelte +369 -0
- package/dist/components/Stepper/StepperStep.svelte.d.ts +63 -0
- package/dist/components/Table/Table.svelte +167 -0
- package/dist/components/Table/Table.svelte.d.ts +56 -0
- package/dist/components/Table/TableBody.svelte +41 -0
- package/dist/components/Table/TableBody.svelte.d.ts +33 -0
- package/dist/components/Table/TableCell.svelte +76 -0
- package/dist/components/Table/TableCell.svelte.d.ts +36 -0
- package/dist/components/Table/TableHead.svelte +41 -0
- package/dist/components/Table/TableHead.svelte.d.ts +32 -0
- package/dist/components/Table/TableHeader.svelte +148 -0
- package/dist/components/Table/TableHeader.svelte.d.ts +42 -0
- package/dist/components/Table/TableRow.svelte +99 -0
- package/dist/components/Table/TableRow.svelte.d.ts +40 -0
- package/dist/components/Tabs/Tab.svelte +145 -0
- package/dist/components/Tabs/Tab.svelte.d.ts +36 -0
- package/dist/components/Tabs/TabList.svelte +60 -0
- package/dist/components/Tabs/TabList.svelte.d.ts +32 -0
- package/dist/components/Tabs/TabPanel.svelte +118 -0
- package/dist/components/Tabs/TabPanel.svelte.d.ts +38 -0
- package/dist/components/Tabs/Tabs.svelte +287 -0
- package/dist/components/Tabs/Tabs.svelte.d.ts +50 -0
- package/dist/components/Tag/Tag.svelte +260 -0
- package/dist/components/Tag/Tag.svelte.d.ts +54 -0
- package/dist/components/Tag/TagGroup.svelte +147 -0
- package/dist/components/Tag/TagGroup.svelte.d.ts +62 -0
- package/dist/components/ThemeToggle/ThemeToggle.svelte +93 -0
- package/dist/components/ThemeToggle/ThemeToggle.svelte.d.ts +12 -0
- package/dist/components/Timeline/Timeline.svelte +144 -0
- package/dist/components/Timeline/Timeline.svelte.d.ts +48 -0
- package/dist/components/Timeline/TimelineItem.svelte +391 -0
- package/dist/components/Timeline/TimelineItem.svelte.d.ts +63 -0
- package/dist/components/Toast/Toast.svelte +313 -0
- package/dist/components/Toast/Toast.svelte.d.ts +44 -0
- package/dist/components/Toast/toastStore.d.ts +40 -0
- package/dist/components/Toast/toastStore.js +293 -0
- package/dist/components/Tooltip/Tooltip.svelte +282 -0
- package/dist/components/Tooltip/Tooltip.svelte.d.ts +55 -0
- package/dist/components/Tree/Tree.svelte +129 -0
- package/dist/components/Tree/Tree.svelte.d.ts +61 -0
- package/dist/components/Tree/TreeNode.svelte +332 -0
- package/dist/components/Tree/TreeNode.svelte.d.ts +55 -0
- package/dist/components/icons/TwintrinsicLogo.svelte +73 -0
- package/dist/components/icons/TwintrinsicLogo.svelte.d.ts +17 -0
- package/dist/components/icons/twintrinsic-source.svg +73 -0
- package/dist/components/icons/twintrinsic.svg +38 -0
- package/dist/docs/EventsTable.svelte +86 -0
- package/dist/docs/EventsTable.svelte.d.ts +27 -0
- package/dist/docs/PropsTable.svelte +103 -0
- package/dist/docs/PropsTable.svelte.d.ts +28 -0
- package/dist/docs/index.d.ts +2 -0
- package/dist/docs/index.js +2 -0
- package/dist/helpers/detectLanguage.d.ts +6 -0
- package/dist/helpers/detectLanguage.js +60 -0
- package/dist/helpers/index.d.ts +1 -0
- package/dist/helpers/index.js +1 -0
- package/dist/index.d.ts +86 -0
- package/dist/index.js +94 -0
- package/dist/twintrinsic.css +347 -0
- 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
|
+
};
|