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
package/README.md
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Twintrinsic
|
|
2
|
+
A tailwind-based collection of svelte components.
|
|
3
|
+
|
|
4
|
+
# WTF is Twintrinsic?
|
|
5
|
+
I got this idea during the christmas break of 2022 when I was looking for a new UI library that was flexible enough to allow me to extend it in ways I wanted and had good accessibility support. After combing through a bunch, I got the idea to try to create a small lib that was basically extensions of HTML. Since HTML elements already have basic accessibility built-in, it's a no-brainer to use these instead of fancy custom elements. I also wanted to use Tailwind for its themeability and easy customization. HTML in intrinsic to the web and tailwind is an extension, so i got `tailwind + intrinsic = twintrinsic`.
|
|
6
|
+
|
|
7
|
+
# Performance
|
|
8
|
+
I am not going to worry about performance for now. I am going to use available HTML and CSS as much as possible, without using Javascript for interactivity unless absolutely necessary. This should keep the compiled bundle pretty performant. My main focus is going to be on code readability, accessibility, and extensibility.
|
|
9
|
+
|
|
10
|
+
## Components:
|
|
11
|
+
This is in order of heirarchy.
|
|
12
|
+
- [ ] Container
|
|
13
|
+
- [ ] Panel (collapsible content and header)
|
|
14
|
+
- [ ] Sidebar (attaches to side of parent)
|
|
15
|
+
- [ ] BottomBar
|
|
16
|
+
- [ ] Accordion
|
|
17
|
+
- [ ] Card
|
|
18
|
+
- [ ] Lazy (content loads when card is visible)
|
|
19
|
+
- [ ]
|
|
20
|
+
- [ ] AppHeader
|
|
21
|
+
- [ ] App
|
|
22
|
+
- [ ] `split` is IDE-style (resizable panels)
|
|
23
|
+
- [ ] Separator (visual HR/VR with text, icon, etc)
|
|
24
|
+
- [ ]Form
|
|
25
|
+
- [ ] General (all inputs)
|
|
26
|
+
- [ ] Input Validation
|
|
27
|
+
- [ ] floating labels (optional)
|
|
28
|
+
- [ ] compact view ("input group" with icons on left/right)
|
|
29
|
+
- [ ] Placeholder
|
|
30
|
+
- [ ] input masking (formatting display)
|
|
31
|
+
- [ ] AutoComplete
|
|
32
|
+
- [ ] Calendar
|
|
33
|
+
- [ ] Checkbox
|
|
34
|
+
- [ ] configurable states / icons
|
|
35
|
+
- [ ] ListInput (multiple value with "chips")
|
|
36
|
+
- [ ] ColorPicker
|
|
37
|
+
- [ ] Dropdown
|
|
38
|
+
- [ ] Cascading Menu
|
|
39
|
+
- [ ] Multiple selection
|
|
40
|
+
- [ ] icons
|
|
41
|
+
- [ ] FloatLabel
|
|
42
|
+
- [ ] NumberInput
|
|
43
|
+
- [ ] unit display (with masking)
|
|
44
|
+
- [ ] vertical
|
|
45
|
+
- [ ] InputSwitch
|
|
46
|
+
- [ ] InputText
|
|
47
|
+
- [ ] InvalidState
|
|
48
|
+
- [ ] Knob (circle progress "slider")
|
|
49
|
+
- [ ] Listbox
|
|
50
|
+
- [ ] MultiSelect
|
|
51
|
+
- [ ] Password
|
|
52
|
+
- [ ] RadioButton
|
|
53
|
+
- [ ] Rating
|
|
54
|
+
- [ ] SelectButton
|
|
55
|
+
- [ ] Slider
|
|
56
|
+
- [ ] Textarea
|
|
57
|
+
- [ ] ToggleButton
|
|
58
|
+
- [ ] TreeSelect
|
|
59
|
+
- [ ] Validation on all inputs
|
|
60
|
+
- [ ]
|
|
61
|
+
- [ ] Advanced
|
|
62
|
+
- [ ] Editor
|
|
63
|
+
- [ ] Terminal
|
|
64
|
+
|
|
65
|
+
- [ ]General
|
|
66
|
+
- [ ] Localization
|
|
67
|
+
- [ ] Theming
|
|
68
|
+
- [ ] Colors
|
|
69
|
+
- [ ] Specifying Iconsets
|
|
70
|
+
- [ ] Button
|
|
71
|
+
- [ ] Button
|
|
72
|
+
- [ ] Speed Dial
|
|
73
|
+
- [ ] SplitButton
|
|
74
|
+
- [ ] Data
|
|
75
|
+
- [ ] DataTable
|
|
76
|
+
- [ ] DataView
|
|
77
|
+
- [ ] VirtualScroller
|
|
78
|
+
- [ ] FilterService
|
|
79
|
+
- [ ] FullCalendar
|
|
80
|
+
- [ ] OrderList
|
|
81
|
+
- [ ] OrganizationChart
|
|
82
|
+
- [ ] Paginator
|
|
83
|
+
- [ ] PickList
|
|
84
|
+
- [ ] Timeline
|
|
85
|
+
- [ ] Tree
|
|
86
|
+
- [ ] TreeTable
|
|
87
|
+
- [ ] Panel
|
|
88
|
+
- [ ] Accordion
|
|
89
|
+
- [ ] Card
|
|
90
|
+
- [ ] Deferred
|
|
91
|
+
- [ ] Divider
|
|
92
|
+
- [ ] Fieldset
|
|
93
|
+
- [ ] Panel
|
|
94
|
+
- [ ] Splitter
|
|
95
|
+
- [ ] ScrollPanel
|
|
96
|
+
- [ ] TabView
|
|
97
|
+
- [ ] Toolbar
|
|
98
|
+
- [ ] Overlay
|
|
99
|
+
- [ ] ConfirmDialog
|
|
100
|
+
- [ ] ConfirmPopup
|
|
101
|
+
- [ ] Dialog
|
|
102
|
+
- [ ] DynamicDialog
|
|
103
|
+
- [ ] OverlayPanel
|
|
104
|
+
- [ ] Sidebar
|
|
105
|
+
- [ ] Tooltip
|
|
106
|
+
- [ ] File
|
|
107
|
+
- [ ] Upload
|
|
108
|
+
- [ ] Menu
|
|
109
|
+
- [ ] MenuModel
|
|
110
|
+
- [ ] BreadCrumb
|
|
111
|
+
- [ ] ContextMenu
|
|
112
|
+
- [ ] MegaMenu
|
|
113
|
+
- [ ] Menu
|
|
114
|
+
- [ ] Menubar
|
|
115
|
+
- [ ] PanelMenu
|
|
116
|
+
- [ ] Steps
|
|
117
|
+
- [ ] TabMenu
|
|
118
|
+
- [ ] TieredMenu
|
|
119
|
+
- [ ] Dock
|
|
120
|
+
- [ ] Chart
|
|
121
|
+
- [ ] ChartModel
|
|
122
|
+
- [ ] Pie
|
|
123
|
+
- [ ] Doughnut
|
|
124
|
+
- [ ] Bar
|
|
125
|
+
- [ ] Line
|
|
126
|
+
- [ ] PolarArea
|
|
127
|
+
- [ ] Radar
|
|
128
|
+
- [ ] Combo
|
|
129
|
+
- [ ] Messages
|
|
130
|
+
- [ ] Message
|
|
131
|
+
- [ ] Toast
|
|
132
|
+
- [ ] Media
|
|
133
|
+
- [ ] Carousel
|
|
134
|
+
- [ ] Galleria
|
|
135
|
+
- [ ] Image
|
|
136
|
+
- [ ] Misc
|
|
137
|
+
- [ ] Avatar
|
|
138
|
+
- [ ] Badge
|
|
139
|
+
- [ ] BlockUI
|
|
140
|
+
- [ ] Chip
|
|
141
|
+
- [ ] FocusTrap
|
|
142
|
+
- [ ] Inplace
|
|
143
|
+
- [ ] ProgressBar
|
|
144
|
+
- [ ] ProgressSpinner
|
|
145
|
+
- [ ] Ripple
|
|
146
|
+
- [ ] ScrollTop
|
|
147
|
+
- [ ] Skeleton
|
|
148
|
+
- [ ] StyleClass
|
|
149
|
+
- [ ] Tag
|
|
150
|
+
- [ ] Terminal
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { onDestroy, setContext } from "svelte"
|
|
3
|
+
export let darkMode = false
|
|
4
|
+
|
|
5
|
+
setContext("appDarkMode", {
|
|
6
|
+
getDarkMode: () => darkMode,
|
|
7
|
+
})
|
|
8
|
+
export let appName = "Twintrinsic App"
|
|
9
|
+
export let leftPanelWidth = "300px"
|
|
10
|
+
export let rightPanelWidth = "300px"
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<svelte:head>
|
|
14
|
+
<title>{appName}</title>
|
|
15
|
+
</svelte:head>
|
|
16
|
+
<!-- <svelte:body class="{darkMode ? "dark" : "light"}"/> -->
|
|
17
|
+
<div class='app bg-element-100 dark:bg-dark dark:text-light min-h-screen' style="--left-panel-width: {leftPanelWidth}; --right-panel-width: {rightPanelWidth};">
|
|
18
|
+
{#if $$slots.menu}
|
|
19
|
+
<div class="appMenu">
|
|
20
|
+
<slot name="menu"/>
|
|
21
|
+
</div>
|
|
22
|
+
{/if}
|
|
23
|
+
{#if $$slots.header}
|
|
24
|
+
<div class="appHeader">
|
|
25
|
+
<slot name="header"/>
|
|
26
|
+
</div>
|
|
27
|
+
{/if}
|
|
28
|
+
<div class="appWrapper w-full flex flex-col sm:flex-row flex-wrap sm:flex-nowrap py-4 grow">
|
|
29
|
+
{#if $$slots.leftPanel}
|
|
30
|
+
<div class="appLeftPanel w-fixed w-full shrink grow-0 px-4">
|
|
31
|
+
<div class="sticky top-0 p-4 w-full h-full">
|
|
32
|
+
<slot name="leftPanel"/>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
{/if}
|
|
36
|
+
<main class="appMain w-full grow pt-1 px-3">
|
|
37
|
+
<slot/>
|
|
38
|
+
</main>
|
|
39
|
+
{#if $$slots.rightPanel}
|
|
40
|
+
<div class="appRightPanel w-fixed w-full shrink grow-0 px-2">
|
|
41
|
+
<!-- fixed-width -->
|
|
42
|
+
<div class="flex sm:flex-col px-2">
|
|
43
|
+
<slot name="rightPanel"/>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
{/if}
|
|
47
|
+
</div>
|
|
48
|
+
{#if $$slots.footer}
|
|
49
|
+
<footer class="bg-black mt-auto">
|
|
50
|
+
<slot name="footer"/>
|
|
51
|
+
</footer>
|
|
52
|
+
{/if}
|
|
53
|
+
</div>
|
|
54
|
+
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export default App;
|
|
2
|
+
type App = SvelteComponent<$$__sveltets_2_PropsWithChildren<{
|
|
3
|
+
darkMode?: boolean | undefined;
|
|
4
|
+
appName?: string | undefined;
|
|
5
|
+
leftPanelWidth?: string | undefined;
|
|
6
|
+
rightPanelWidth?: string | undefined;
|
|
7
|
+
}, {
|
|
8
|
+
menu: {};
|
|
9
|
+
header: {};
|
|
10
|
+
leftPanel: {};
|
|
11
|
+
default: {};
|
|
12
|
+
rightPanel: {};
|
|
13
|
+
footer: {};
|
|
14
|
+
}>, {
|
|
15
|
+
[evt: string]: CustomEvent<any>;
|
|
16
|
+
}, {
|
|
17
|
+
menu: {};
|
|
18
|
+
header: {};
|
|
19
|
+
leftPanel: {};
|
|
20
|
+
default: {};
|
|
21
|
+
rightPanel: {};
|
|
22
|
+
footer: {};
|
|
23
|
+
}> & {
|
|
24
|
+
$$bindings?: string | undefined;
|
|
25
|
+
};
|
|
26
|
+
declare const App: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
|
|
27
|
+
darkMode?: boolean | undefined;
|
|
28
|
+
appName?: string | undefined;
|
|
29
|
+
leftPanelWidth?: string | undefined;
|
|
30
|
+
rightPanelWidth?: string | undefined;
|
|
31
|
+
}, {
|
|
32
|
+
menu: {};
|
|
33
|
+
header: {};
|
|
34
|
+
leftPanel: {};
|
|
35
|
+
default: {};
|
|
36
|
+
rightPanel: {};
|
|
37
|
+
footer: {};
|
|
38
|
+
}>, {
|
|
39
|
+
[evt: string]: CustomEvent<any>;
|
|
40
|
+
}, {
|
|
41
|
+
menu: {};
|
|
42
|
+
header: {};
|
|
43
|
+
leftPanel: {};
|
|
44
|
+
default: {};
|
|
45
|
+
rightPanel: {};
|
|
46
|
+
footer: {};
|
|
47
|
+
}, {}, string>;
|
|
48
|
+
type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
|
|
49
|
+
default: any;
|
|
50
|
+
} ? Props extends Record<string, never> ? any : {
|
|
51
|
+
children?: any;
|
|
52
|
+
} : {});
|
|
53
|
+
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> {
|
|
54
|
+
new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
|
|
55
|
+
$$bindings?: Bindings;
|
|
56
|
+
} & Exports;
|
|
57
|
+
(internal: unknown, props: Props & {
|
|
58
|
+
$$events?: Events;
|
|
59
|
+
$$slots?: Slots;
|
|
60
|
+
}): Exports & {
|
|
61
|
+
$set?: any;
|
|
62
|
+
$on?: any;
|
|
63
|
+
};
|
|
64
|
+
z_$$bindings?: Bindings;
|
|
65
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
const {
|
|
3
|
+
heading = "",
|
|
4
|
+
class: propClasses = "",
|
|
5
|
+
type = null,
|
|
6
|
+
} = $props<{ heading?: string; class?: string; type?: string | null }>()
|
|
7
|
+
|
|
8
|
+
const typeCSS = $derived(type ? `bg-${type}` : "")
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<style>
|
|
12
|
+
@reference "./twintrinsic.css";
|
|
13
|
+
.twin-section {
|
|
14
|
+
@apply m-2 my-4;
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
|
|
18
|
+
<section class="twin-section {propClasses} {typeCSS}">
|
|
19
|
+
{#if $$slots.heading}
|
|
20
|
+
<slot name="heading">
|
|
21
|
+
<h2>{heading}</h2>
|
|
22
|
+
</slot>
|
|
23
|
+
{/if}
|
|
24
|
+
<slot></slot>
|
|
25
|
+
</section>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
type $$ComponentProps = {
|
|
2
|
+
heading?: string;
|
|
3
|
+
class?: string;
|
|
4
|
+
type?: string | null;
|
|
5
|
+
};
|
|
6
|
+
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> {
|
|
7
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
8
|
+
$$bindings?: Bindings;
|
|
9
|
+
} & Exports;
|
|
10
|
+
(internal: unknown, props: Props & {
|
|
11
|
+
$$events?: Events;
|
|
12
|
+
$$slots?: Slots;
|
|
13
|
+
}): Exports & {
|
|
14
|
+
$set?: any;
|
|
15
|
+
$on?: any;
|
|
16
|
+
};
|
|
17
|
+
z_$$bindings?: Bindings;
|
|
18
|
+
}
|
|
19
|
+
type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
|
|
20
|
+
default: any;
|
|
21
|
+
} ? Props extends Record<string, never> ? any : {
|
|
22
|
+
children?: any;
|
|
23
|
+
} : {});
|
|
24
|
+
declare const Section: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<$$ComponentProps, {
|
|
25
|
+
heading: {};
|
|
26
|
+
default: {};
|
|
27
|
+
}>, {
|
|
28
|
+
[evt: string]: CustomEvent<any>;
|
|
29
|
+
}, {
|
|
30
|
+
heading: {};
|
|
31
|
+
default: {};
|
|
32
|
+
}, {}, "">;
|
|
33
|
+
type Section = InstanceType<typeof Section>;
|
|
34
|
+
export default Section;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action that triggers a callback when clicking outside of an element
|
|
3
|
+
* @param node - The element to watch for outside clicks
|
|
4
|
+
* @param callback - Function to call when clicking outside
|
|
5
|
+
* @returns Action object with destroy method
|
|
6
|
+
*/
|
|
7
|
+
export declare function clickOutside(node: HTMLElement, callback: () => void): {
|
|
8
|
+
destroy(): void;
|
|
9
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action that triggers a callback when clicking outside of an element
|
|
3
|
+
* @param node - The element to watch for outside clicks
|
|
4
|
+
* @param callback - Function to call when clicking outside
|
|
5
|
+
* @returns Action object with destroy method
|
|
6
|
+
*/
|
|
7
|
+
export function clickOutside(node, callback) {
|
|
8
|
+
function handleClick(event) {
|
|
9
|
+
if (node && !node.contains(event.target) && event.target instanceof Node) {
|
|
10
|
+
callback();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
document.addEventListener("click", handleClick, true);
|
|
14
|
+
return {
|
|
15
|
+
destroy() {
|
|
16
|
+
document.removeEventListener("click", handleClick, true);
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { clickOutside } from "./clickOutside";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { clickOutside } from "./clickOutside";
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Accordion - A group of collapsible panels using native HTML details/summary elements.
|
|
4
|
+
By default, only one panel can be open at a time using the native `name` attribute.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
```svelte
|
|
8
|
+
<Accordion>
|
|
9
|
+
<AccordionItem>
|
|
10
|
+
<svelte:fragment slot="header">Section 1</svelte:fragment>
|
|
11
|
+
Content for section 1
|
|
12
|
+
</AccordionItem>
|
|
13
|
+
<AccordionItem>
|
|
14
|
+
<svelte:fragment slot="header">Section 2</svelte:fragment>
|
|
15
|
+
Content for section 2
|
|
16
|
+
</AccordionItem>
|
|
17
|
+
</Accordion>
|
|
18
|
+
```
|
|
19
|
+
-->
|
|
20
|
+
<script lang="ts">
|
|
21
|
+
import type { Snippet } from "svelte";
|
|
22
|
+
import { setContext } from "svelte";
|
|
23
|
+
|
|
24
|
+
interface Props {
|
|
25
|
+
/** Additional CSS classes */
|
|
26
|
+
class?: string;
|
|
27
|
+
/** HTML id for accessibility */
|
|
28
|
+
id?: string;
|
|
29
|
+
/** Whether to allow multiple panels to be open simultaneously */
|
|
30
|
+
allowMultiple?: boolean;
|
|
31
|
+
/** Index of the initially expanded item (null for all collapsed) */
|
|
32
|
+
defaultExpanded?: number | null;
|
|
33
|
+
/** Whether to add a border around the accordion */
|
|
34
|
+
bordered?: boolean;
|
|
35
|
+
/** Change event handler */
|
|
36
|
+
onchange?: (event: CustomEvent<{ expandedItems: number[] }>) => void;
|
|
37
|
+
children?: Snippet;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
let {
|
|
41
|
+
class: className = "",
|
|
42
|
+
id = crypto.randomUUID(),
|
|
43
|
+
allowMultiple = false,
|
|
44
|
+
defaultExpanded = 0,
|
|
45
|
+
bordered = true,
|
|
46
|
+
onchange,
|
|
47
|
+
children,
|
|
48
|
+
}: Props = $props();
|
|
49
|
+
|
|
50
|
+
const groupName = crypto.randomUUID();
|
|
51
|
+
|
|
52
|
+
const accordionContext = $derived({
|
|
53
|
+
groupName,
|
|
54
|
+
allowMultiple,
|
|
55
|
+
defaultExpanded,
|
|
56
|
+
onchange,
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
setContext("accordion", accordionContext);
|
|
60
|
+
</script>
|
|
61
|
+
|
|
62
|
+
<div
|
|
63
|
+
class="accordion {bordered ? 'border border-border dark:border-border rounded-lg' : ''} {className}"
|
|
64
|
+
id={id}
|
|
65
|
+
>
|
|
66
|
+
{@render children?.()}
|
|
67
|
+
</div>
|
|
68
|
+
|
|
69
|
+
<style>
|
|
70
|
+
@reference "../../twintrinsic.css";
|
|
71
|
+
|
|
72
|
+
.accordion {
|
|
73
|
+
@apply divide-y divide-border dark:divide-border overflow-hidden;
|
|
74
|
+
}
|
|
75
|
+
</style>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Additional CSS classes */
|
|
4
|
+
class?: string;
|
|
5
|
+
/** HTML id for accessibility */
|
|
6
|
+
id?: string;
|
|
7
|
+
/** Whether to allow multiple panels to be open simultaneously */
|
|
8
|
+
allowMultiple?: boolean;
|
|
9
|
+
/** Index of the initially expanded item (null for all collapsed) */
|
|
10
|
+
defaultExpanded?: number | null;
|
|
11
|
+
/** Whether to add a border around the accordion */
|
|
12
|
+
bordered?: boolean;
|
|
13
|
+
/** Change event handler */
|
|
14
|
+
onchange?: (event: CustomEvent<{
|
|
15
|
+
expandedItems: number[];
|
|
16
|
+
}>) => void;
|
|
17
|
+
children?: Snippet;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Accordion - A group of collapsible panels using native HTML details/summary elements.
|
|
21
|
+
* By default, only one panel can be open at a time using the native `name` attribute.
|
|
22
|
+
*
|
|
23
|
+
* Usage:
|
|
24
|
+
* ```svelte
|
|
25
|
+
* <Accordion>
|
|
26
|
+
* <AccordionItem>
|
|
27
|
+
* <svelte:fragment slot="header">Section 1</svelte:fragment>
|
|
28
|
+
* Content for section 1
|
|
29
|
+
* </AccordionItem>
|
|
30
|
+
* <AccordionItem>
|
|
31
|
+
* <svelte:fragment slot="header">Section 2</svelte:fragment>
|
|
32
|
+
* Content for section 2
|
|
33
|
+
* </AccordionItem>
|
|
34
|
+
* </Accordion>
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
declare const Accordion: import("svelte").Component<Props, {}, "">;
|
|
38
|
+
type Accordion = ReturnType<typeof Accordion>;
|
|
39
|
+
export default Accordion;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
AccordionItem - Individual item within an Accordion component.
|
|
4
|
+
Uses native HTML details/summary elements for semantic disclosure.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
```svelte
|
|
8
|
+
<AccordionItem>
|
|
9
|
+
<svelte:fragment slot="header">Section Title</svelte:fragment>
|
|
10
|
+
Content goes here
|
|
11
|
+
</AccordionItem>
|
|
12
|
+
```
|
|
13
|
+
-->
|
|
14
|
+
<script lang="ts">
|
|
15
|
+
import type { Snippet } from "svelte";
|
|
16
|
+
import { getContext, onMount } from "svelte";
|
|
17
|
+
|
|
18
|
+
interface AccordionContext {
|
|
19
|
+
groupName: string;
|
|
20
|
+
allowMultiple: boolean;
|
|
21
|
+
defaultExpanded: number | null;
|
|
22
|
+
onchange?: (event: CustomEvent<{ expandedItems: number[] }>) => void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface Props {
|
|
26
|
+
/** Additional CSS classes */
|
|
27
|
+
class?: string;
|
|
28
|
+
/** HTML id for accessibility */
|
|
29
|
+
id?: string;
|
|
30
|
+
/** ARIA label for the header */
|
|
31
|
+
ariaLabel?: string;
|
|
32
|
+
/** Whether to disable the item controls */
|
|
33
|
+
disabled?: boolean;
|
|
34
|
+
/** Whether to show the expand/collapse icon */
|
|
35
|
+
showIcon?: boolean;
|
|
36
|
+
children?: Snippet;
|
|
37
|
+
header?: Snippet;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
let {
|
|
41
|
+
class: className = "",
|
|
42
|
+
id = crypto.randomUUID(),
|
|
43
|
+
ariaLabel,
|
|
44
|
+
disabled = false,
|
|
45
|
+
showIcon = true,
|
|
46
|
+
children,
|
|
47
|
+
header,
|
|
48
|
+
}: Props = $props();
|
|
49
|
+
|
|
50
|
+
const accordion = getContext<AccordionContext | undefined>("accordion");
|
|
51
|
+
|
|
52
|
+
let index = $state(-1);
|
|
53
|
+
let detailsElement: HTMLDetailsElement | undefined = $state();
|
|
54
|
+
|
|
55
|
+
onMount(() => {
|
|
56
|
+
const parent = detailsElement?.parentElement;
|
|
57
|
+
if (parent) {
|
|
58
|
+
const items = Array.from(parent.children);
|
|
59
|
+
index = items.indexOf(detailsElement!);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const shouldBeOpen = $derived(
|
|
64
|
+
accordion?.defaultExpanded === index && accordion?.defaultExpanded !== null
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
function handleToggle(event: Event): void {
|
|
68
|
+
if (disabled) {
|
|
69
|
+
event.preventDefault();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const target = event.target as HTMLDetailsElement;
|
|
74
|
+
accordion?.onchange?.(
|
|
75
|
+
new CustomEvent("change", {
|
|
76
|
+
detail: { expandedItems: [index] },
|
|
77
|
+
})
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
</script>
|
|
81
|
+
|
|
82
|
+
<details
|
|
83
|
+
class="accordion-item {className}"
|
|
84
|
+
class:disabled
|
|
85
|
+
bind:this={detailsElement}
|
|
86
|
+
{id}
|
|
87
|
+
name={accordion?.allowMultiple ? undefined : accordion?.groupName}
|
|
88
|
+
ontoggle={handleToggle}
|
|
89
|
+
open={shouldBeOpen}
|
|
90
|
+
>
|
|
91
|
+
<summary
|
|
92
|
+
class="
|
|
93
|
+
w-full flex items-center justify-between
|
|
94
|
+
px-4 py-3
|
|
95
|
+
text-left
|
|
96
|
+
bg-surface dark:bg-surface
|
|
97
|
+
hover:bg-hover dark:hover:bg-hover
|
|
98
|
+
focus:outline-none focus:ring-2 focus:ring-focus-ring dark:focus:ring-focus-ring
|
|
99
|
+
cursor-pointer
|
|
100
|
+
text-text dark:text-text
|
|
101
|
+
"
|
|
102
|
+
aria-label={ariaLabel}
|
|
103
|
+
>
|
|
104
|
+
<div class="flex items-center gap-2">
|
|
105
|
+
{#if header}
|
|
106
|
+
{@render header()}
|
|
107
|
+
{:else}
|
|
108
|
+
Item
|
|
109
|
+
{/if}
|
|
110
|
+
</div>
|
|
111
|
+
|
|
112
|
+
{#if showIcon}
|
|
113
|
+
<svg
|
|
114
|
+
class="w-5 h-5 transform transition-transform duration-200 text-muted dark:text-muted"
|
|
115
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
116
|
+
viewBox="0 0 20 20"
|
|
117
|
+
fill="currentColor"
|
|
118
|
+
aria-hidden="true"
|
|
119
|
+
>
|
|
120
|
+
<path
|
|
121
|
+
fill-rule="evenodd"
|
|
122
|
+
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
|
123
|
+
clip-rule="evenodd"
|
|
124
|
+
/>
|
|
125
|
+
</svg>
|
|
126
|
+
{/if}
|
|
127
|
+
</summary>
|
|
128
|
+
|
|
129
|
+
<div
|
|
130
|
+
class="px-4 py-3 bg-background dark:bg-background text-text dark:text-text"
|
|
131
|
+
>
|
|
132
|
+
{@render children?.()}
|
|
133
|
+
</div>
|
|
134
|
+
</details>
|
|
135
|
+
|
|
136
|
+
<style>
|
|
137
|
+
@reference "../../twintrinsic.css";
|
|
138
|
+
|
|
139
|
+
.accordion-item {
|
|
140
|
+
@apply overflow-hidden;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.accordion-item.disabled {
|
|
144
|
+
@apply opacity-50 cursor-not-allowed pointer-events-none;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
:is(details[open]) :is(summary) :is(svg) {
|
|
148
|
+
@apply rotate-180;
|
|
149
|
+
}
|
|
150
|
+
</style>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Additional CSS classes */
|
|
4
|
+
class?: string;
|
|
5
|
+
/** HTML id for accessibility */
|
|
6
|
+
id?: string;
|
|
7
|
+
/** ARIA label for the header */
|
|
8
|
+
ariaLabel?: string;
|
|
9
|
+
/** Whether to disable the item controls */
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
/** Whether to show the expand/collapse icon */
|
|
12
|
+
showIcon?: boolean;
|
|
13
|
+
children?: Snippet;
|
|
14
|
+
header?: Snippet;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* AccordionItem - Individual item within an Accordion component.
|
|
18
|
+
* Uses native HTML details/summary elements for semantic disclosure.
|
|
19
|
+
*
|
|
20
|
+
* Usage:
|
|
21
|
+
* ```svelte
|
|
22
|
+
* <AccordionItem>
|
|
23
|
+
* <svelte:fragment slot="header">Section Title</svelte:fragment>
|
|
24
|
+
* Content goes here
|
|
25
|
+
* </AccordionItem>
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
declare const AccordionItem: import("svelte").Component<Props, {}, "">;
|
|
29
|
+
type AccordionItem = ReturnType<typeof AccordionItem>;
|
|
30
|
+
export default AccordionItem;
|