picocrank 1.25.1 → 1.26.0
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/eslint.config.js +68 -0
- package/package.json +13 -3
- package/router.js +74 -0
- package/styles/dark-theme.css +21 -9
- package/styles/picocrank-extensions.css +131 -2
- package/supplemental-themes/catppuccin-latte-frappe/theme.css +12 -22
- package/supplemental-themes/dracula-alucard/theme.css +12 -22
- package/supplemental-themes/gruvbox-dark-light/theme.css +12 -22
- package/supplemental-themes/waffles/theme.css +2 -12
- package/vue/components/Breadcrumbs.vue +192 -45
- package/vue/components/Calendar.vue +93 -180
- package/vue/components/DangerZone.vue +186 -0
- package/vue/components/Header.vue +22 -6
- package/vue/components/Login.vue +6 -7
- package/vue/components/NavigationGrid.vue +26 -204
- package/vue/components/NotificationBlock.vue +120 -0
- package/vue/components/NotificationPopup.vue +44 -41
- package/vue/components/QuickSearch.vue +21 -47
- package/vue/components/RadioGroup.vue +4 -4
- package/vue/components/ReadOnlyTextArea.vue +1 -1
- package/vue/components/SidebarNavLink.vue +3 -3
- package/vue/components/Table.vue +109 -81
- package/vue/components/TableColumnFilterPopover.vue +7 -17
- package/vue/components/TableColumnOptionsPopover.vue +22 -27
- package/vue/components/Tabs.vue +366 -82
- package/vue/components/TopBar.vue +2 -2
- package/vue/composables/tableColumnPriorities.js +33 -0
- package/vue/composables/tableFilters.js +1 -1
- package/vue/data/navSectionHubs.js +196 -0
- package/vue/data/routeBreadcrumbs.js +90 -0
- package/vue/examples/Admin.vue +12 -12
- package/vue/examples/App.vue +27 -36
- package/vue/examples/CalendarExample.vue +32 -22
- package/vue/examples/ExampleHeaderThemeSwitcher.vue +1 -1
- package/vue/examples/Login.vue +0 -3
- package/vue/examples/LoginExample.vue +2 -14
- package/vue/examples/NavSectionHub.vue +36 -0
- package/vue/examples/PageStructure.vue +6 -3
- package/vue/examples/StatusExample.vue +248 -129
- package/vue/examples/TableExample.vue +68 -67
- package/vue/examples/TabsExample.vue +200 -255
- package/vue/examples/ThemePreview.vue +21 -23
- package/vue/examples/ViewItem.vue +32 -5
- package/vue/examples/Welcome.vue +3 -112
package/vue/examples/Welcome.vue
CHANGED
|
@@ -40,31 +40,13 @@
|
|
|
40
40
|
<Section
|
|
41
41
|
id="start-here"
|
|
42
42
|
title="Start here"
|
|
43
|
-
subtitle="
|
|
43
|
+
subtitle="Browse example categories — use the sidebar for direct links, or the top bar when hubs are enabled"
|
|
44
44
|
>
|
|
45
45
|
<Navigation ref="welcomeNavigation">
|
|
46
46
|
<NavigationGrid />
|
|
47
47
|
</Navigation>
|
|
48
48
|
</Section>
|
|
49
49
|
|
|
50
|
-
<Section
|
|
51
|
-
title="Popular examples"
|
|
52
|
-
subtitle="A few good places to begin"
|
|
53
|
-
>
|
|
54
|
-
<div class="grid-boxed welcome-popular-grid">
|
|
55
|
-
<router-link
|
|
56
|
-
v-for="example in popularExamples"
|
|
57
|
-
:key="example.name"
|
|
58
|
-
:to="{ name: example.name }"
|
|
59
|
-
class="stat-display welcome-popular-card"
|
|
60
|
-
>
|
|
61
|
-
<span class="subtle">{{ example.category }}</span>
|
|
62
|
-
<span class="stat">{{ example.label }}</span>
|
|
63
|
-
<span class="welcome-popular-description">{{ example.description }}</span>
|
|
64
|
-
</router-link>
|
|
65
|
-
</div>
|
|
66
|
-
</Section>
|
|
67
|
-
|
|
68
50
|
<Section
|
|
69
51
|
title="Try it"
|
|
70
52
|
subtitle="Small interactions you can trigger right now"
|
|
@@ -104,38 +86,12 @@ import Section from '../components/Section.vue'
|
|
|
104
86
|
import Navigation from '../components/Navigation.vue'
|
|
105
87
|
import NavigationGrid from '../components/NavigationGrid.vue'
|
|
106
88
|
import { useNotificationPopups } from '../composables/useNotificationPopups.js'
|
|
89
|
+
import { registerWelcomeHubGrid } from '../data/navSectionHubs.js'
|
|
107
90
|
import logoUrl from '/logo.png'
|
|
108
91
|
|
|
109
92
|
const { show: showPopup } = useNotificationPopups()
|
|
110
93
|
const welcomeNavigation = ref(null)
|
|
111
94
|
|
|
112
|
-
const popularExamples = [
|
|
113
|
-
{
|
|
114
|
-
name: 'ThemePreview',
|
|
115
|
-
category: 'Layouts',
|
|
116
|
-
label: 'Theme Switcher',
|
|
117
|
-
description: 'Switch drop-in themes live',
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
name: 'TableExample',
|
|
121
|
-
category: 'Data display',
|
|
122
|
-
label: 'Table',
|
|
123
|
-
description: 'Sorting, pagination, and column filters',
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
name: 'CalendarExample',
|
|
127
|
-
category: 'Data display',
|
|
128
|
-
label: 'Calendar',
|
|
129
|
-
description: 'Events, drag-and-drop, and date ranges',
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
name: 'ButtonsExample',
|
|
133
|
-
category: 'Forms & input',
|
|
134
|
-
label: 'Buttons',
|
|
135
|
-
description: 'Variants, toolbars, and form actions',
|
|
136
|
-
},
|
|
137
|
-
]
|
|
138
|
-
|
|
139
95
|
function showWelcomeToast() {
|
|
140
96
|
showPopup({
|
|
141
97
|
label: 'WELCOME',
|
|
@@ -147,45 +103,7 @@ function showWelcomeToast() {
|
|
|
147
103
|
}
|
|
148
104
|
|
|
149
105
|
onMounted(() => {
|
|
150
|
-
|
|
151
|
-
return
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
const nav = welcomeNavigation.value
|
|
155
|
-
|
|
156
|
-
nav.addRouterLink('PageStructure', 'Page structure', {
|
|
157
|
-
description: 'Sidebar, header, QuickSearch, and breadcrumbs',
|
|
158
|
-
})
|
|
159
|
-
nav.addRouterLink('ThemePreview', 'Theme Switcher', {
|
|
160
|
-
description: 'Drop-in themes on Femtocrank',
|
|
161
|
-
})
|
|
162
|
-
nav.addRouterLink('TableExample', 'Table', {
|
|
163
|
-
description: 'Lists with sorting, pagination, and filters',
|
|
164
|
-
})
|
|
165
|
-
nav.addRouterLink('TableRemoteExample', 'Remote table', {
|
|
166
|
-
description: 'Server-style fetchRows pagination and filters',
|
|
167
|
-
})
|
|
168
|
-
nav.addRouterLink('CalendarExample', 'Calendar', {
|
|
169
|
-
description: 'Month view with events',
|
|
170
|
-
})
|
|
171
|
-
nav.addRouterLink('ButtonsExample', 'Buttons', {
|
|
172
|
-
description: 'Button variants and toolbars',
|
|
173
|
-
})
|
|
174
|
-
nav.addRouterLink('FormExample', 'Forms', {
|
|
175
|
-
description: 'Labels, inputs, and fieldsets',
|
|
176
|
-
})
|
|
177
|
-
nav.addRouterLink('LoginExample', 'Login', {
|
|
178
|
-
description: 'Auth form with OAuth tabs',
|
|
179
|
-
})
|
|
180
|
-
nav.addRouterLink('StatusExample', 'Status', {
|
|
181
|
-
description: 'Notifications and inline status',
|
|
182
|
-
})
|
|
183
|
-
nav.addRouterLink('NavigationGridExample', 'Navigation grid', {
|
|
184
|
-
description: 'Icon grid for settings hubs',
|
|
185
|
-
})
|
|
186
|
-
nav.addRouterLink('TabsExample', 'Tabs', {
|
|
187
|
-
description: 'Tabbed content regions',
|
|
188
|
-
})
|
|
106
|
+
registerWelcomeHubGrid(welcomeNavigation.value)
|
|
189
107
|
})
|
|
190
108
|
</script>
|
|
191
109
|
|
|
@@ -212,31 +130,4 @@ onMounted(() => {
|
|
|
212
130
|
gap: 0.5rem;
|
|
213
131
|
margin-bottom: 0.75rem;
|
|
214
132
|
}
|
|
215
|
-
|
|
216
|
-
.welcome-popular-grid {
|
|
217
|
-
grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
.welcome-popular-card {
|
|
221
|
-
display: flex;
|
|
222
|
-
flex-direction: column;
|
|
223
|
-
gap: 0.35rem;
|
|
224
|
-
text-decoration: none;
|
|
225
|
-
color: inherit;
|
|
226
|
-
transition: transform 0.15s ease, box-shadow 0.15s ease;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
.welcome-popular-card:hover {
|
|
230
|
-
transform: translateY(-2px);
|
|
231
|
-
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
.welcome-popular-description {
|
|
235
|
-
font-size: 0.85rem;
|
|
236
|
-
color: #666;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
html[data-theme="dark"] .welcome-popular-description {
|
|
240
|
-
color: #bbb;
|
|
241
|
-
}
|
|
242
133
|
</style>
|