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.
Files changed (44) hide show
  1. package/eslint.config.js +68 -0
  2. package/package.json +13 -3
  3. package/router.js +74 -0
  4. package/styles/dark-theme.css +21 -9
  5. package/styles/picocrank-extensions.css +131 -2
  6. package/supplemental-themes/catppuccin-latte-frappe/theme.css +12 -22
  7. package/supplemental-themes/dracula-alucard/theme.css +12 -22
  8. package/supplemental-themes/gruvbox-dark-light/theme.css +12 -22
  9. package/supplemental-themes/waffles/theme.css +2 -12
  10. package/vue/components/Breadcrumbs.vue +192 -45
  11. package/vue/components/Calendar.vue +93 -180
  12. package/vue/components/DangerZone.vue +186 -0
  13. package/vue/components/Header.vue +22 -6
  14. package/vue/components/Login.vue +6 -7
  15. package/vue/components/NavigationGrid.vue +26 -204
  16. package/vue/components/NotificationBlock.vue +120 -0
  17. package/vue/components/NotificationPopup.vue +44 -41
  18. package/vue/components/QuickSearch.vue +21 -47
  19. package/vue/components/RadioGroup.vue +4 -4
  20. package/vue/components/ReadOnlyTextArea.vue +1 -1
  21. package/vue/components/SidebarNavLink.vue +3 -3
  22. package/vue/components/Table.vue +109 -81
  23. package/vue/components/TableColumnFilterPopover.vue +7 -17
  24. package/vue/components/TableColumnOptionsPopover.vue +22 -27
  25. package/vue/components/Tabs.vue +366 -82
  26. package/vue/components/TopBar.vue +2 -2
  27. package/vue/composables/tableColumnPriorities.js +33 -0
  28. package/vue/composables/tableFilters.js +1 -1
  29. package/vue/data/navSectionHubs.js +196 -0
  30. package/vue/data/routeBreadcrumbs.js +90 -0
  31. package/vue/examples/Admin.vue +12 -12
  32. package/vue/examples/App.vue +27 -36
  33. package/vue/examples/CalendarExample.vue +32 -22
  34. package/vue/examples/ExampleHeaderThemeSwitcher.vue +1 -1
  35. package/vue/examples/Login.vue +0 -3
  36. package/vue/examples/LoginExample.vue +2 -14
  37. package/vue/examples/NavSectionHub.vue +36 -0
  38. package/vue/examples/PageStructure.vue +6 -3
  39. package/vue/examples/StatusExample.vue +248 -129
  40. package/vue/examples/TableExample.vue +68 -67
  41. package/vue/examples/TabsExample.vue +200 -255
  42. package/vue/examples/ThemePreview.vue +21 -23
  43. package/vue/examples/ViewItem.vue +32 -5
  44. package/vue/examples/Welcome.vue +3 -112
@@ -40,31 +40,13 @@
40
40
  <Section
41
41
  id="start-here"
42
42
  title="Start here"
43
- subtitle="Jump into the example areas"
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
- if (!welcomeNavigation.value) {
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>