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,186 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Badge - A component for displaying small counts, status indicators, or labels.
|
|
4
|
+
Provides consistent styling, accessibility features, and various display options.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
```svelte
|
|
8
|
+
<Badge>New</Badge>
|
|
9
|
+
|
|
10
|
+
<Badge variant="primary" size="lg">42</Badge>
|
|
11
|
+
|
|
12
|
+
<Badge variant="success" dot>Online</Badge>
|
|
13
|
+
|
|
14
|
+
<Button>
|
|
15
|
+
Notifications
|
|
16
|
+
<Badge variant="error">5</Badge>
|
|
17
|
+
</Button>
|
|
18
|
+
```
|
|
19
|
+
-->
|
|
20
|
+
<script>
|
|
21
|
+
const {
|
|
22
|
+
/** @type {string} - Additional CSS classes */
|
|
23
|
+
class: className = "",
|
|
24
|
+
|
|
25
|
+
/** @type {string} - HTML id for accessibility */
|
|
26
|
+
id = crypto.randomUUID(),
|
|
27
|
+
|
|
28
|
+
/** @type {string} - Visual style variant */
|
|
29
|
+
variant = "default",
|
|
30
|
+
|
|
31
|
+
/** @type {string} - Size of the badge (sm, md, lg) */
|
|
32
|
+
size = "md",
|
|
33
|
+
|
|
34
|
+
/** @type {boolean} - Whether to show as a dot indicator */
|
|
35
|
+
dot = false,
|
|
36
|
+
|
|
37
|
+
/** @type {boolean} - Whether to show as a pill shape */
|
|
38
|
+
pill = false,
|
|
39
|
+
|
|
40
|
+
/** @type {boolean} - Whether to show as an outline */
|
|
41
|
+
outline = false,
|
|
42
|
+
|
|
43
|
+
/** @type {boolean} - Whether to add a subtle pulse animation */
|
|
44
|
+
pulse = false,
|
|
45
|
+
|
|
46
|
+
/** @type {boolean} - Whether to hide when content is empty */
|
|
47
|
+
hideEmpty = false,
|
|
48
|
+
|
|
49
|
+
/** @type {boolean} - Whether to position as an absolute overlay */
|
|
50
|
+
overlay = false,
|
|
51
|
+
|
|
52
|
+
/** @type {string} - Position when used as overlay (top-right, top-left, etc.) */
|
|
53
|
+
position = "top-right",
|
|
54
|
+
|
|
55
|
+
children,
|
|
56
|
+
} = $props()
|
|
57
|
+
|
|
58
|
+
// Determine if badge should be hidden
|
|
59
|
+
const isEmpty = $derived(!children || children().toString().trim() === "")
|
|
60
|
+
const isHidden = $derived(hideEmpty && isEmpty)
|
|
61
|
+
|
|
62
|
+
// Determine variant classes
|
|
63
|
+
const variantClasses = $derived(
|
|
64
|
+
{
|
|
65
|
+
default: "bg-muted/20 text-muted dark:bg-muted/20 dark:text-muted",
|
|
66
|
+
primary: "bg-primary-500 text-white dark:bg-primary-500 dark:text-white",
|
|
67
|
+
secondary: "bg-secondary-500 text-white dark:bg-secondary-500 dark:text-white",
|
|
68
|
+
success: "bg-success-500 text-white dark:bg-success-500 dark:text-white",
|
|
69
|
+
warning: "bg-warning-500 text-white dark:bg-warning-500 dark:text-white",
|
|
70
|
+
error: "bg-error-500 text-white dark:bg-error-500 dark:text-white",
|
|
71
|
+
info: "bg-info-500 text-white dark:bg-info-500 dark:text-white",
|
|
72
|
+
}[variant] || "bg-muted/20 text-muted dark:bg-muted/20 dark:text-muted"
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
// Determine outline variant classes
|
|
76
|
+
const outlineClasses = $derived(
|
|
77
|
+
outline
|
|
78
|
+
? {
|
|
79
|
+
default: "bg-transparent border border-muted text-muted dark:border-muted dark:text-muted",
|
|
80
|
+
primary:
|
|
81
|
+
"bg-transparent border border-primary-500 text-primary-500 dark:border-primary-500 dark:text-primary-500",
|
|
82
|
+
secondary:
|
|
83
|
+
"bg-transparent border border-secondary-500 text-secondary-500 dark:border-secondary-500 dark:text-secondary-500",
|
|
84
|
+
success:
|
|
85
|
+
"bg-transparent border border-success-500 text-success-500 dark:border-success-500 dark:text-success-500",
|
|
86
|
+
warning:
|
|
87
|
+
"bg-transparent border border-warning-500 text-warning-500 dark:border-warning-500 dark:text-warning-500",
|
|
88
|
+
error:
|
|
89
|
+
"bg-transparent border border-error-500 text-error-500 dark:border-error-500 dark:text-error-500",
|
|
90
|
+
info: "bg-transparent border border-info-500 text-info-500 dark:border-info-500 dark:text-info-500",
|
|
91
|
+
}[variant]
|
|
92
|
+
: ""
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
// Determine size classes
|
|
96
|
+
const sizeClasses = $derived(
|
|
97
|
+
{
|
|
98
|
+
sm: "text-xs px-1.5 py-0.5 min-w-4 h-4",
|
|
99
|
+
md: "text-xs px-2 py-0.5 min-w-5 h-5",
|
|
100
|
+
lg: "text-sm px-2.5 py-0.5 min-w-6 h-6",
|
|
101
|
+
}[size] || "text-xs px-2 py-0.5 min-w-5 h-5"
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
// Determine dot size classes
|
|
105
|
+
const dotSizeClasses = $derived(
|
|
106
|
+
{
|
|
107
|
+
sm: "w-2 h-2",
|
|
108
|
+
md: "w-2.5 h-2.5",
|
|
109
|
+
lg: "w-3 h-3",
|
|
110
|
+
}[size] || "w-2.5 h-2.5"
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
// Determine position classes for overlay
|
|
114
|
+
const positionClasses = $derived(
|
|
115
|
+
overlay
|
|
116
|
+
? {
|
|
117
|
+
"top-right": "absolute -top-1 -right-1",
|
|
118
|
+
"top-left": "absolute -top-1 -left-1",
|
|
119
|
+
"bottom-right": "absolute -bottom-1 -right-1",
|
|
120
|
+
"bottom-left": "absolute -bottom-1 -left-1",
|
|
121
|
+
}[position] || "absolute -top-1 -right-1"
|
|
122
|
+
: ""
|
|
123
|
+
)
|
|
124
|
+
</script>
|
|
125
|
+
|
|
126
|
+
{#if !isHidden}
|
|
127
|
+
<span
|
|
128
|
+
{id}
|
|
129
|
+
class="
|
|
130
|
+
badge
|
|
131
|
+
{dot ? 'badge-dot' : ''}
|
|
132
|
+
{pill ? 'badge-pill' : ''}
|
|
133
|
+
{pulse ? 'badge-pulse' : ''}
|
|
134
|
+
{overlay ? 'badge-overlay' : ''}
|
|
135
|
+
{outline ? outlineClasses : variantClasses}
|
|
136
|
+
{dot ? dotSizeClasses : sizeClasses}
|
|
137
|
+
{positionClasses}
|
|
138
|
+
{className}
|
|
139
|
+
"
|
|
140
|
+
role={dot ? 'status' : 'status'}
|
|
141
|
+
aria-label={dot ? 'Status indicator' : undefined}
|
|
142
|
+
>
|
|
143
|
+
{#if !dot}
|
|
144
|
+
{@render children?.()}
|
|
145
|
+
{/if}
|
|
146
|
+
</span>
|
|
147
|
+
{/if}
|
|
148
|
+
|
|
149
|
+
<style>
|
|
150
|
+
@reference "../../twintrinsic.css";
|
|
151
|
+
|
|
152
|
+
.badge {
|
|
153
|
+
@apply inline-flex items-center justify-center;
|
|
154
|
+
@apply font-medium leading-none;
|
|
155
|
+
@apply rounded;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.badge-pill {
|
|
159
|
+
@apply rounded-full;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.badge-dot {
|
|
163
|
+
@apply rounded-full;
|
|
164
|
+
@apply flex-shrink-0;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.badge-overlay {
|
|
168
|
+
@apply z-10;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.badge-pulse {
|
|
172
|
+
animation: badge-pulse 1.5s infinite;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
@keyframes badge-pulse {
|
|
176
|
+
0% {
|
|
177
|
+
box-shadow: 0 0 0 0 rgba(var(--color-primary-500-rgb), 0.4);
|
|
178
|
+
}
|
|
179
|
+
70% {
|
|
180
|
+
box-shadow: 0 0 0 6px rgba(var(--color-primary-500-rgb), 0);
|
|
181
|
+
}
|
|
182
|
+
100% {
|
|
183
|
+
box-shadow: 0 0 0 0 rgba(var(--color-primary-500-rgb), 0);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
</style>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export default Badge;
|
|
2
|
+
type Badge = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Badge - A component for displaying small counts, status indicators, or labels.
|
|
8
|
+
* Provides consistent styling, accessibility features, and various display options.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```svelte
|
|
12
|
+
* <Badge>New</Badge>
|
|
13
|
+
*
|
|
14
|
+
* <Badge variant="primary" size="lg">42</Badge>
|
|
15
|
+
*
|
|
16
|
+
* <Badge variant="success" dot>Online</Badge>
|
|
17
|
+
*
|
|
18
|
+
* <Button>
|
|
19
|
+
* Notifications
|
|
20
|
+
* <Badge variant="error">5</Badge>
|
|
21
|
+
* </Button>
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
declare const Badge: import("svelte").Component<{
|
|
25
|
+
class?: string;
|
|
26
|
+
id?: any;
|
|
27
|
+
variant?: string;
|
|
28
|
+
size?: string;
|
|
29
|
+
dot?: boolean;
|
|
30
|
+
pill?: boolean;
|
|
31
|
+
outline?: boolean;
|
|
32
|
+
pulse?: boolean;
|
|
33
|
+
hideEmpty?: boolean;
|
|
34
|
+
overlay?: boolean;
|
|
35
|
+
position?: string;
|
|
36
|
+
children: any;
|
|
37
|
+
}, {}, "">;
|
|
38
|
+
type $$ComponentProps = {
|
|
39
|
+
class?: string;
|
|
40
|
+
id?: any;
|
|
41
|
+
variant?: string;
|
|
42
|
+
size?: string;
|
|
43
|
+
dot?: boolean;
|
|
44
|
+
pill?: boolean;
|
|
45
|
+
outline?: boolean;
|
|
46
|
+
pulse?: boolean;
|
|
47
|
+
hideEmpty?: boolean;
|
|
48
|
+
overlay?: boolean;
|
|
49
|
+
position?: string;
|
|
50
|
+
children: any;
|
|
51
|
+
};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
BottomBar - A collapsible bottom panel that attaches to its parent container.
|
|
4
|
+
Built on top of the Panel component with additional positioning and animation features.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
```svelte
|
|
8
|
+
<BottomBar>
|
|
9
|
+
<svelte:fragment slot="header">Details</svelte:fragment>
|
|
10
|
+
Content here
|
|
11
|
+
</BottomBar>
|
|
12
|
+
|
|
13
|
+
<BottomBar expanded={false} height="20rem">
|
|
14
|
+
<svelte:fragment slot="header">Console</svelte:fragment>
|
|
15
|
+
Console output here
|
|
16
|
+
</BottomBar>
|
|
17
|
+
```
|
|
18
|
+
-->
|
|
19
|
+
<script lang="ts">
|
|
20
|
+
import { slide } from "svelte/transition"
|
|
21
|
+
import Panel from "../Panel/Panel.svelte"
|
|
22
|
+
|
|
23
|
+
type BottomBarProps = {
|
|
24
|
+
expanded?: boolean
|
|
25
|
+
class?: string
|
|
26
|
+
height?: string
|
|
27
|
+
id?: string
|
|
28
|
+
ariaLabel?: string
|
|
29
|
+
disabled?: boolean
|
|
30
|
+
floatOnMobile?: boolean
|
|
31
|
+
docked?: boolean
|
|
32
|
+
ontoggle?: (payload: { expanded: boolean }) => void
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const {
|
|
36
|
+
expanded = true,
|
|
37
|
+
class: className = "",
|
|
38
|
+
height = "16rem",
|
|
39
|
+
id = crypto.randomUUID(),
|
|
40
|
+
ariaLabel,
|
|
41
|
+
disabled = false,
|
|
42
|
+
floatOnMobile = true,
|
|
43
|
+
docked = false,
|
|
44
|
+
ontoggle,
|
|
45
|
+
} = $props() satisfies BottomBarProps
|
|
46
|
+
|
|
47
|
+
let isExpanded = $state(false)
|
|
48
|
+
let bottomBarElement = $state()
|
|
49
|
+
|
|
50
|
+
// Initialize and sync expanded state when prop changes
|
|
51
|
+
$effect(() => {
|
|
52
|
+
isExpanded = expanded
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
// Handle toggle from Panel
|
|
56
|
+
function handleToggle(payload: { expanded: boolean }) {
|
|
57
|
+
isExpanded = payload.expanded
|
|
58
|
+
ontoggle?.({ expanded: isExpanded })
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Handle escape key
|
|
62
|
+
function handleKeydown(event: KeyboardEvent) {
|
|
63
|
+
if (!disabled && event.key === "Escape" && isExpanded) {
|
|
64
|
+
isExpanded = false
|
|
65
|
+
ontoggle?.({ expanded: isExpanded })
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
</script>
|
|
69
|
+
|
|
70
|
+
<svelte:window onkeydown={handleKeydown} />
|
|
71
|
+
|
|
72
|
+
<div
|
|
73
|
+
class="
|
|
74
|
+
bottombar-container
|
|
75
|
+
{docked ? 'bottombar-docked' : ''}
|
|
76
|
+
{floatOnMobile ? 'bottombar-float-mobile' : ''}
|
|
77
|
+
{className}
|
|
78
|
+
"
|
|
79
|
+
style="--bottombar-height: {height}"
|
|
80
|
+
{id}
|
|
81
|
+
role="complementary"
|
|
82
|
+
aria-label={ariaLabel}
|
|
83
|
+
>
|
|
84
|
+
<div
|
|
85
|
+
class="
|
|
86
|
+
bottombar
|
|
87
|
+
{isExpanded ? 'bottombar-expanded' : 'bottombar-collapsed'}
|
|
88
|
+
"
|
|
89
|
+
role="region"
|
|
90
|
+
aria-labelledby="{id}-header"
|
|
91
|
+
>
|
|
92
|
+
<Panel
|
|
93
|
+
expanded={isExpanded}
|
|
94
|
+
{disabled}
|
|
95
|
+
bordered={false}
|
|
96
|
+
ontoggle={handleToggle}
|
|
97
|
+
>
|
|
98
|
+
<svelte:fragment slot="header">
|
|
99
|
+
<slot name="header" />
|
|
100
|
+
</svelte:fragment>
|
|
101
|
+
<slot />
|
|
102
|
+
</Panel>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
<style>
|
|
107
|
+
@reference "../../twintrinsic.css";
|
|
108
|
+
.bottombar-container {
|
|
109
|
+
@apply relative w-full;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* Base bottombar styles */
|
|
113
|
+
.bottombar {
|
|
114
|
+
@apply bg-background transition-[height,transform] duration-200 ease-in-out overflow-hidden;
|
|
115
|
+
height: var(--bottombar-height);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* Collapsed state */
|
|
119
|
+
.bottombar-collapsed {
|
|
120
|
+
@apply translate-y-full;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* Expanded state */
|
|
124
|
+
.bottombar-expanded {
|
|
125
|
+
@apply translate-y-0;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Docked styles */
|
|
129
|
+
.bottombar-docked {
|
|
130
|
+
@apply fixed bottom-0 left-0 right-0 z-50;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* Mobile styles */
|
|
134
|
+
@media (max-width: 640px) {
|
|
135
|
+
.bottombar-float-mobile .bottombar {
|
|
136
|
+
@apply fixed bottom-0 left-0 right-0 z-50;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* Non-floating mobile styles */
|
|
141
|
+
@media (max-width: 640px) {
|
|
142
|
+
.bottombar:not(.bottombar-float-mobile) {
|
|
143
|
+
@apply w-full;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
</style>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
2
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
3
|
+
$$bindings?: Bindings;
|
|
4
|
+
} & Exports;
|
|
5
|
+
(internal: unknown, props: {
|
|
6
|
+
$$events?: Events;
|
|
7
|
+
$$slots?: Slots;
|
|
8
|
+
}): Exports & {
|
|
9
|
+
$set?: any;
|
|
10
|
+
$on?: any;
|
|
11
|
+
};
|
|
12
|
+
z_$$bindings?: Bindings;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* BottomBar - A collapsible bottom panel that attaches to its parent container.
|
|
16
|
+
* Built on top of the Panel component with additional positioning and animation features.
|
|
17
|
+
*
|
|
18
|
+
* Usage:
|
|
19
|
+
* ```svelte
|
|
20
|
+
* <BottomBar>
|
|
21
|
+
* <svelte:fragment slot="header">Details</svelte:fragment>
|
|
22
|
+
* Content here
|
|
23
|
+
* </BottomBar>
|
|
24
|
+
*
|
|
25
|
+
* <BottomBar expanded={false} height="20rem">
|
|
26
|
+
* <svelte:fragment slot="header">Console</svelte:fragment>
|
|
27
|
+
* Console output here
|
|
28
|
+
* </BottomBar>
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
declare const BottomBar: $$__sveltets_2_IsomorphicComponent<any, {
|
|
32
|
+
[evt: string]: CustomEvent<any>;
|
|
33
|
+
}, {
|
|
34
|
+
header: {};
|
|
35
|
+
default: {};
|
|
36
|
+
}, {}, "">;
|
|
37
|
+
type BottomBar = InstanceType<typeof BottomBar>;
|
|
38
|
+
export default BottomBar;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Breadcrumb - A navigation component that helps users understand their location in a website or application.
|
|
4
|
+
Provides a hierarchical trail of links with proper accessibility features.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
```svelte
|
|
8
|
+
<Breadcrumb>
|
|
9
|
+
<BreadcrumbItem href="/">Home</BreadcrumbItem>
|
|
10
|
+
<BreadcrumbItem href="/products">Products</BreadcrumbItem>
|
|
11
|
+
<BreadcrumbItem>Current Page</BreadcrumbItem>
|
|
12
|
+
</Breadcrumb>
|
|
13
|
+
|
|
14
|
+
<Breadcrumb separator="/">
|
|
15
|
+
<BreadcrumbItem href="/">Home</BreadcrumbItem>
|
|
16
|
+
<BreadcrumbItem href="/docs">Documentation</BreadcrumbItem>
|
|
17
|
+
<BreadcrumbItem>Components</BreadcrumbItem>
|
|
18
|
+
</Breadcrumb>
|
|
19
|
+
```
|
|
20
|
+
-->
|
|
21
|
+
<script>
|
|
22
|
+
import { setContext } from "svelte"
|
|
23
|
+
|
|
24
|
+
const {
|
|
25
|
+
/** @type {string} - Additional CSS classes */
|
|
26
|
+
class: className = "",
|
|
27
|
+
|
|
28
|
+
/** @type {string} - HTML id for accessibility */
|
|
29
|
+
id = crypto.randomUUID(),
|
|
30
|
+
|
|
31
|
+
/** @type {string} - Separator character or HTML between items */
|
|
32
|
+
separator = "/",
|
|
33
|
+
|
|
34
|
+
/** @type {string} - ARIA label for the breadcrumb */
|
|
35
|
+
ariaLabel = "Breadcrumb",
|
|
36
|
+
|
|
37
|
+
/** @type {boolean} - Whether to collapse long breadcrumbs with ellipsis */
|
|
38
|
+
collapsible = false,
|
|
39
|
+
|
|
40
|
+
/** @type {number} - Maximum visible items when collapsed (excluding first and last) */
|
|
41
|
+
maxVisibleItems = 1,
|
|
42
|
+
|
|
43
|
+
children,
|
|
44
|
+
} = $props()
|
|
45
|
+
|
|
46
|
+
// Provide context for child components
|
|
47
|
+
$effect(() => {
|
|
48
|
+
const breadcrumbContext = {
|
|
49
|
+
separator,
|
|
50
|
+
collapsible,
|
|
51
|
+
maxVisibleItems,
|
|
52
|
+
}
|
|
53
|
+
setContext("breadcrumb", breadcrumbContext)
|
|
54
|
+
})
|
|
55
|
+
</script>
|
|
56
|
+
|
|
57
|
+
<nav
|
|
58
|
+
{id}
|
|
59
|
+
class="breadcrumb {className}"
|
|
60
|
+
aria-label={ariaLabel}
|
|
61
|
+
>
|
|
62
|
+
<ol class="breadcrumb-list">
|
|
63
|
+
{@render children?.()}
|
|
64
|
+
</ol>
|
|
65
|
+
</nav>
|
|
66
|
+
|
|
67
|
+
<style>
|
|
68
|
+
@reference "../../twintrinsic.css";
|
|
69
|
+
|
|
70
|
+
.breadcrumb {
|
|
71
|
+
@apply w-full;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.breadcrumb-list {
|
|
75
|
+
@apply flex flex-wrap items-center;
|
|
76
|
+
}
|
|
77
|
+
</style>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export default Breadcrumb;
|
|
2
|
+
type Breadcrumb = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Breadcrumb - A navigation component that helps users understand their location in a website or application.
|
|
8
|
+
* Provides a hierarchical trail of links with proper accessibility features.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```svelte
|
|
12
|
+
* <Breadcrumb>
|
|
13
|
+
* <BreadcrumbItem href="/">Home</BreadcrumbItem>
|
|
14
|
+
* <BreadcrumbItem href="/products">Products</BreadcrumbItem>
|
|
15
|
+
* <BreadcrumbItem>Current Page</BreadcrumbItem>
|
|
16
|
+
* </Breadcrumb>
|
|
17
|
+
*
|
|
18
|
+
* <Breadcrumb separator="/">
|
|
19
|
+
* <BreadcrumbItem href="/">Home</BreadcrumbItem>
|
|
20
|
+
* <BreadcrumbItem href="/docs">Documentation</BreadcrumbItem>
|
|
21
|
+
* <BreadcrumbItem>Components</BreadcrumbItem>
|
|
22
|
+
* </Breadcrumb>
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
declare const Breadcrumb: import("svelte").Component<{
|
|
26
|
+
class?: string;
|
|
27
|
+
id?: any;
|
|
28
|
+
separator?: string;
|
|
29
|
+
ariaLabel?: string;
|
|
30
|
+
collapsible?: boolean;
|
|
31
|
+
maxVisibleItems?: number;
|
|
32
|
+
children: any;
|
|
33
|
+
}, {}, "">;
|
|
34
|
+
type $$ComponentProps = {
|
|
35
|
+
class?: string;
|
|
36
|
+
id?: any;
|
|
37
|
+
separator?: string;
|
|
38
|
+
ariaLabel?: string;
|
|
39
|
+
collapsible?: boolean;
|
|
40
|
+
maxVisibleItems?: number;
|
|
41
|
+
children: any;
|
|
42
|
+
};
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
BreadcrumbItem - An individual item within a Breadcrumb component.
|
|
4
|
+
Renders as a link when href is provided, otherwise as a span for the current page.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
```svelte
|
|
8
|
+
<BreadcrumbItem href="/">Home</BreadcrumbItem>
|
|
9
|
+
|
|
10
|
+
<BreadcrumbItem href="/products" icon="<svg>...</svg>">
|
|
11
|
+
Products
|
|
12
|
+
</BreadcrumbItem>
|
|
13
|
+
|
|
14
|
+
<BreadcrumbItem>Current Page</BreadcrumbItem>
|
|
15
|
+
```
|
|
16
|
+
-->
|
|
17
|
+
<script>
|
|
18
|
+
import { getContext, onMount } from "svelte"
|
|
19
|
+
|
|
20
|
+
const {
|
|
21
|
+
/** @type {string} - Additional CSS classes */
|
|
22
|
+
class: className = "",
|
|
23
|
+
|
|
24
|
+
/** @type {string} - Link URL (if item is a link) */
|
|
25
|
+
href,
|
|
26
|
+
|
|
27
|
+
/** @type {string} - Link target (_blank, _self, etc.) */
|
|
28
|
+
target,
|
|
29
|
+
|
|
30
|
+
/** @type {string} - Icon to display (HTML or SVG string) */
|
|
31
|
+
icon,
|
|
32
|
+
|
|
33
|
+
/** @type {boolean} - Whether this is the current/active page */
|
|
34
|
+
current = false,
|
|
35
|
+
|
|
36
|
+
/** @type {boolean} - Whether this item should be hidden when collapsed */
|
|
37
|
+
collapsible = true,
|
|
38
|
+
|
|
39
|
+
children,
|
|
40
|
+
} = $props()
|
|
41
|
+
|
|
42
|
+
// Get breadcrumb context
|
|
43
|
+
const breadcrumbContext = getContext("breadcrumb")
|
|
44
|
+
|
|
45
|
+
// Get separator from context
|
|
46
|
+
const separator = breadcrumbContext?.separator || "/"
|
|
47
|
+
|
|
48
|
+
// Component state
|
|
49
|
+
let itemElement
|
|
50
|
+
let index = $state(-1)
|
|
51
|
+
let isVisible = $state(true)
|
|
52
|
+
|
|
53
|
+
// Register with parent on mount
|
|
54
|
+
onMount(() => {
|
|
55
|
+
if (itemElement) {
|
|
56
|
+
// Find our index among siblings
|
|
57
|
+
const parent = itemElement.parentElement
|
|
58
|
+
if (parent) {
|
|
59
|
+
const items = Array.from(parent.children)
|
|
60
|
+
index = items.indexOf(itemElement)
|
|
61
|
+
|
|
62
|
+
// Check if we should be visible based on collapsible settings
|
|
63
|
+
if (breadcrumbContext?.collapsible && collapsible) {
|
|
64
|
+
const maxVisible = breadcrumbContext.maxVisibleItems || 1
|
|
65
|
+
const totalItems = items.length
|
|
66
|
+
|
|
67
|
+
// Always show first and last items
|
|
68
|
+
if (index === 0 || index === totalItems - 1) {
|
|
69
|
+
isVisible = true
|
|
70
|
+
} else {
|
|
71
|
+
// For middle items, only show up to maxVisible
|
|
72
|
+
const middleItems = totalItems - 2 // excluding first and last
|
|
73
|
+
|
|
74
|
+
if (middleItems <= maxVisible) {
|
|
75
|
+
// If we have fewer middle items than max, show all
|
|
76
|
+
isVisible = true
|
|
77
|
+
} else {
|
|
78
|
+
// Otherwise, only show the first maxVisible middle items
|
|
79
|
+
isVisible = index <= maxVisible
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
// Determine if this is the last item
|
|
88
|
+
const isLast = $derived(index === -1 || !itemElement?.nextElementSibling)
|
|
89
|
+
|
|
90
|
+
// Determine if this is the current page
|
|
91
|
+
const isCurrent = $derived(current || isLast)
|
|
92
|
+
</script>
|
|
93
|
+
|
|
94
|
+
<li
|
|
95
|
+
class="
|
|
96
|
+
breadcrumb-item
|
|
97
|
+
{isCurrent ? 'breadcrumb-item-current' : ''}
|
|
98
|
+
{isVisible ? '' : 'breadcrumb-item-hidden'}
|
|
99
|
+
{className}
|
|
100
|
+
"
|
|
101
|
+
aria-current={isCurrent ? 'page' : undefined}
|
|
102
|
+
bind:this={itemElement}
|
|
103
|
+
>
|
|
104
|
+
{#if href && !isCurrent}
|
|
105
|
+
<a
|
|
106
|
+
{href}
|
|
107
|
+
{target}
|
|
108
|
+
class="breadcrumb-link"
|
|
109
|
+
>
|
|
110
|
+
{#if icon}
|
|
111
|
+
<span class="breadcrumb-icon" aria-hidden="true">
|
|
112
|
+
{@html icon}
|
|
113
|
+
</span>
|
|
114
|
+
{/if}
|
|
115
|
+
<span class="breadcrumb-text">
|
|
116
|
+
{@render children?.()}
|
|
117
|
+
</span>
|
|
118
|
+
</a>
|
|
119
|
+
{:else}
|
|
120
|
+
<span class="breadcrumb-text">
|
|
121
|
+
{#if icon}
|
|
122
|
+
<span class="breadcrumb-icon" aria-hidden="true">
|
|
123
|
+
{@html icon}
|
|
124
|
+
</span>
|
|
125
|
+
{/if}
|
|
126
|
+
{@render children?.()}
|
|
127
|
+
</span>
|
|
128
|
+
{/if}
|
|
129
|
+
|
|
130
|
+
{#if !isLast}
|
|
131
|
+
<span class="breadcrumb-separator" aria-hidden="true">
|
|
132
|
+
{@html separator}
|
|
133
|
+
</span>
|
|
134
|
+
{/if}
|
|
135
|
+
</li>
|
|
136
|
+
|
|
137
|
+
<style>
|
|
138
|
+
@reference "../../twintrinsic.css";
|
|
139
|
+
|
|
140
|
+
.breadcrumb-item {
|
|
141
|
+
@apply flex items-center;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.breadcrumb-item-hidden {
|
|
145
|
+
@apply hidden;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.breadcrumb-link {
|
|
149
|
+
@apply inline-flex items-center;
|
|
150
|
+
@apply text-primary-600 dark:text-primary-400;
|
|
151
|
+
@apply hover:text-primary-700 dark:hover:text-primary-300 hover:underline;
|
|
152
|
+
@apply focus:outline-none focus:ring-2 focus:ring-primary-500 dark:focus:ring-primary-400 focus:ring-offset-2 rounded-sm;
|
|
153
|
+
@apply transition-colors duration-150;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.breadcrumb-text {
|
|
157
|
+
@apply inline-flex items-center;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.breadcrumb-item-current .breadcrumb-text {
|
|
161
|
+
@apply font-medium text-text dark:text-text;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.breadcrumb-separator {
|
|
165
|
+
@apply mx-2 text-muted dark:text-muted;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.breadcrumb-icon {
|
|
169
|
+
@apply mr-1 w-4 h-4;
|
|
170
|
+
}
|
|
171
|
+
</style>
|