snice 7.0.2 → 7.1.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 (304) hide show
  1. package/.agents/skills/snice/SKILL.md +4 -0
  2. package/.agents/skills/snice/references/core-kitchen-sink.ts +39 -1
  3. package/README.md +59 -14
  4. package/adapters/react/SniceProvider.js +2 -2
  5. package/adapters/react/SniceRouter.js +2 -2
  6. package/adapters/react/matchRoute.js +2 -2
  7. package/adapters/react/useRequestHandler.js +2 -2
  8. package/bin/analyzer-contracts.js +6 -1
  9. package/bin/postinstall.js +59 -0
  10. package/bin/project-analyzer.js +466 -5
  11. package/bin/snice.js +3 -0
  12. package/dist/app-context.d.ts +11 -0
  13. package/dist/cdn/accordion/snice-accordion.js +2 -2
  14. package/dist/cdn/action-bar/snice-action-bar.js +2 -2
  15. package/dist/cdn/activity-feed/snice-activity-feed.js +2 -2
  16. package/dist/cdn/alert/snice-alert.js +2 -2
  17. package/dist/cdn/app-tiles/snice-app-tiles.js +2 -2
  18. package/dist/cdn/approval-flow/snice-approval-flow.js +2 -2
  19. package/dist/cdn/audio-recorder/snice-audio-recorder.js +2 -2
  20. package/dist/cdn/availability/snice-availability.js +2 -2
  21. package/dist/cdn/avatar/snice-avatar.js +2 -2
  22. package/dist/cdn/avatar-group/snice-avatar-group.js +2 -2
  23. package/dist/cdn/badge/snice-badge.js +2 -2
  24. package/dist/cdn/banner/snice-banner.js +2 -2
  25. package/dist/cdn/binpack/snice-binpack.js +2 -2
  26. package/dist/cdn/book/snice-book.js +2 -2
  27. package/dist/cdn/booking/snice-booking.js +2 -2
  28. package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +2 -2
  29. package/dist/cdn/button/snice-button.js +2 -2
  30. package/dist/cdn/calendar/snice-calendar.js +2 -2
  31. package/dist/cdn/camera/snice-camera.js +2 -2
  32. package/dist/cdn/camera-annotate/snice-camera-annotate.js +2 -2
  33. package/dist/cdn/candlestick/snice-candlestick.js +2 -2
  34. package/dist/cdn/card/snice-card.js +2 -2
  35. package/dist/cdn/carousel/snice-carousel.js +2 -2
  36. package/dist/cdn/cart/snice-cart.js +2 -2
  37. package/dist/cdn/chart/snice-chart.js +2 -2
  38. package/dist/cdn/chat/snice-chat.js +2 -2
  39. package/dist/cdn/checkbox/snice-checkbox.js +2 -2
  40. package/dist/cdn/chip/snice-chip.js +2 -2
  41. package/dist/cdn/code-block/snice-code-block.js +2 -2
  42. package/dist/cdn/color-display/snice-color-display.js +2 -2
  43. package/dist/cdn/color-picker/snice-color-picker.js +2 -2
  44. package/dist/cdn/command-palette/snice-command-palette.js +2 -2
  45. package/dist/cdn/comments/snice-comments.js +2 -2
  46. package/dist/cdn/countdown/snice-countdown.js +2 -2
  47. package/dist/cdn/cropper/snice-cropper.js +2 -2
  48. package/dist/cdn/data-card/snice-data-card.js +2 -2
  49. package/dist/cdn/date-picker/snice-date-picker.js +2 -2
  50. package/dist/cdn/date-range-picker/snice-date-range-picker.js +2 -2
  51. package/dist/cdn/date-time-picker/snice-date-time-picker.js +2 -2
  52. package/dist/cdn/diff/snice-diff.js +2 -2
  53. package/dist/cdn/divider/snice-divider.js +2 -2
  54. package/dist/cdn/doc/snice-doc.js +2 -2
  55. package/dist/cdn/draw/snice-draw.js +2 -2
  56. package/dist/cdn/drawer/snice-drawer.js +2 -2
  57. package/dist/cdn/empty-state/snice-empty-state.js +2 -2
  58. package/dist/cdn/estimate/snice-estimate.js +2 -2
  59. package/dist/cdn/file-gallery/snice-file-gallery.js +2 -2
  60. package/dist/cdn/file-upload/snice-file-upload.js +2 -2
  61. package/dist/cdn/flip-card/snice-flip-card.js +2 -2
  62. package/dist/cdn/flow/snice-flow.js +2 -2
  63. package/dist/cdn/form-layout/snice-form-layout.js +2 -2
  64. package/dist/cdn/funnel/snice-funnel.js +2 -2
  65. package/dist/cdn/gantt/snice-gantt.js +2 -2
  66. package/dist/cdn/gauge/snice-gauge.js +2 -2
  67. package/dist/cdn/grid/snice-grid.js +2 -2
  68. package/dist/cdn/heatmap/snice-heatmap.js +2 -2
  69. package/dist/cdn/image/snice-image.js +2 -2
  70. package/dist/cdn/input/snice-input.js +2 -2
  71. package/dist/cdn/invoice/snice-invoice.js +2 -2
  72. package/dist/cdn/kanban/snice-kanban.js +2 -2
  73. package/dist/cdn/key-value/snice-key-value.js +2 -2
  74. package/dist/cdn/kpi/snice-kpi.js +2 -2
  75. package/dist/cdn/layout/README.md +17 -2
  76. package/dist/cdn/layout/snice-layout.js +1656 -11
  77. package/dist/cdn/layout/snice-layout.js.map +1 -1
  78. package/dist/cdn/layout/snice-layout.min.js +379 -2
  79. package/dist/cdn/layout/snice-layout.min.js.map +1 -1
  80. package/dist/cdn/leaderboard/snice-leaderboard.js +2 -2
  81. package/dist/cdn/link/snice-link.js +2 -2
  82. package/dist/cdn/link-preview/snice-link-preview.js +2 -2
  83. package/dist/cdn/list/snice-list.js +2 -2
  84. package/dist/cdn/location/snice-location.js +2 -2
  85. package/dist/cdn/login/snice-login.js +2 -2
  86. package/dist/cdn/map/snice-map.js +2 -2
  87. package/dist/cdn/markdown/snice-markdown.js +2 -2
  88. package/dist/cdn/masonry/snice-masonry.js +2 -2
  89. package/dist/cdn/menu/snice-menu.js +2 -2
  90. package/dist/cdn/message-strip/snice-message-strip.js +2 -2
  91. package/dist/cdn/modal/snice-modal.js +2 -2
  92. package/dist/cdn/music-player/snice-music-player.js +2 -2
  93. package/dist/cdn/nav/snice-nav.js +2 -2
  94. package/dist/cdn/network-graph/snice-network-graph.js +2 -2
  95. package/dist/cdn/notification-center/snice-notification-center.js +2 -2
  96. package/dist/cdn/order-tracker/snice-order-tracker.js +2 -2
  97. package/dist/cdn/org-chart/snice-org-chart.js +2 -2
  98. package/dist/cdn/pagination/snice-pagination.js +2 -2
  99. package/dist/cdn/paint/snice-paint.js +2 -2
  100. package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +2 -2
  101. package/dist/cdn/permission-matrix/snice-permission-matrix.js +2 -2
  102. package/dist/cdn/podcast-player/snice-podcast-player.js +2 -2
  103. package/dist/cdn/popover/snice-popover.js +2 -2
  104. package/dist/cdn/pricing-table/snice-pricing-table.js +2 -2
  105. package/dist/cdn/product-card/snice-product-card.js +2 -2
  106. package/dist/cdn/progress/snice-progress.js +2 -2
  107. package/dist/cdn/progress-ring/snice-progress-ring.js +2 -2
  108. package/dist/cdn/qr-code/snice-qr-code.js +2 -2
  109. package/dist/cdn/qr-reader/snice-qr-reader.js +2 -2
  110. package/dist/cdn/radio/snice-radio.js +2 -2
  111. package/dist/cdn/range-slider/snice-range-slider.js +2 -2
  112. package/dist/cdn/rating/snice-rating.js +2 -2
  113. package/dist/cdn/receipt/snice-receipt.js +2 -2
  114. package/dist/cdn/recipe/snice-recipe.js +3 -3
  115. package/dist/cdn/recipe/snice-recipe.js.map +1 -1
  116. package/dist/cdn/recipe/snice-recipe.min.js +1 -1
  117. package/dist/cdn/recipe/snice-recipe.min.js.map +1 -1
  118. package/dist/cdn/runtime/README.md +2 -2
  119. package/dist/cdn/runtime/snice-runtime.esm.js +3725 -3336
  120. package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
  121. package/dist/cdn/runtime/snice-runtime.esm.min.js +1 -1
  122. package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
  123. package/dist/cdn/runtime/snice-runtime.js +3727 -3335
  124. package/dist/cdn/runtime/snice-runtime.js.map +1 -1
  125. package/dist/cdn/runtime/snice-runtime.min.js +1 -1
  126. package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
  127. package/dist/cdn/sankey/snice-sankey.js +2 -2
  128. package/dist/cdn/segmented-control/snice-segmented-control.js +2 -2
  129. package/dist/cdn/select/snice-select.js +2 -2
  130. package/dist/cdn/skeleton/snice-skeleton.js +2 -2
  131. package/dist/cdn/slider/snice-slider.js +2 -2
  132. package/dist/cdn/sortable/snice-sortable.js +2 -2
  133. package/dist/cdn/sparkline/snice-sparkline.js +2 -2
  134. package/dist/cdn/spinner/snice-spinner.js +2 -2
  135. package/dist/cdn/split-button/snice-split-button.js +2 -2
  136. package/dist/cdn/split-pane/snice-split-pane.js +2 -2
  137. package/dist/cdn/spotlight/snice-spotlight.js +2 -2
  138. package/dist/cdn/stat-group/snice-stat-group.js +2 -2
  139. package/dist/cdn/step-input/snice-step-input.js +2 -2
  140. package/dist/cdn/stepper/snice-stepper.js +2 -2
  141. package/dist/cdn/switch/snice-switch.js +2 -2
  142. package/dist/cdn/table/README.md +6 -2
  143. package/dist/cdn/table/snice-table.esm.js +366 -56
  144. package/dist/cdn/table/snice-table.esm.js.map +1 -1
  145. package/dist/cdn/table/snice-table.esm.min.js +107 -46
  146. package/dist/cdn/table/snice-table.esm.min.js.map +1 -1
  147. package/dist/cdn/table/snice-table.js +367 -59
  148. package/dist/cdn/table/snice-table.js.map +1 -1
  149. package/dist/cdn/table/snice-table.min.js +155 -94
  150. package/dist/cdn/table/snice-table.min.js.map +1 -1
  151. package/dist/cdn/tabs/snice-tabs.js +2 -2
  152. package/dist/cdn/tag/snice-tag.js +2 -2
  153. package/dist/cdn/tag-input/snice-tag-input.js +2 -2
  154. package/dist/cdn/terminal/snice-terminal.js +3 -2
  155. package/dist/cdn/terminal/snice-terminal.js.map +1 -1
  156. package/dist/cdn/terminal/snice-terminal.min.js +1 -0
  157. package/dist/cdn/terminal/snice-terminal.min.js.map +1 -1
  158. package/dist/cdn/testimonial/snice-testimonial.js +2 -2
  159. package/dist/cdn/textarea/snice-textarea.js +2 -2
  160. package/dist/cdn/time-picker/snice-time-picker.js +2 -2
  161. package/dist/cdn/time-range-picker/snice-time-range-picker.js +2 -2
  162. package/dist/cdn/timeline/snice-timeline.js +2 -2
  163. package/dist/cdn/timer/snice-timer.js +2 -2
  164. package/dist/cdn/toast/snice-toast.js +2 -2
  165. package/dist/cdn/tooltip/snice-tooltip.js +2 -2
  166. package/dist/cdn/tree/snice-tree.js +2 -2
  167. package/dist/cdn/treemap/snice-treemap.js +2 -2
  168. package/dist/cdn/user-card/snice-user-card.js +2 -2
  169. package/dist/cdn/video-player/README.md +1 -1
  170. package/dist/cdn/video-player/snice-video-player.js +3 -2
  171. package/dist/cdn/video-player/snice-video-player.js.map +1 -1
  172. package/dist/cdn/video-player/snice-video-player.min.js +1 -0
  173. package/dist/cdn/video-player/snice-video-player.min.js.map +1 -1
  174. package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +2 -2
  175. package/dist/cdn/waterfall/snice-waterfall.js +2 -2
  176. package/dist/cdn/weather/snice-weather.js +2 -2
  177. package/dist/cdn/work-order/snice-work-order.js +2 -2
  178. package/dist/components/recipe/snice-recipe.js +1 -1
  179. package/dist/components/recipe/snice-recipe.js.map +1 -1
  180. package/dist/components/table/snice-table.d.ts +1 -0
  181. package/dist/components/table/snice-table.js +18 -2
  182. package/dist/components/table/snice-table.js.map +1 -1
  183. package/dist/components/table/table-tree-data.js +1 -0
  184. package/dist/components/table/table-tree-data.js.map +1 -1
  185. package/dist/components/terminal/snice-terminal.js +1 -0
  186. package/dist/components/terminal/snice-terminal.js.map +1 -1
  187. package/dist/components/video-player/snice-video-player.js +1 -0
  188. package/dist/components/video-player/snice-video-player.js.map +1 -1
  189. package/dist/context-provider.d.ts +16 -0
  190. package/dist/daemon-target.d.ts +10 -0
  191. package/dist/daemon.d.ts +10 -0
  192. package/dist/index.cjs +3721 -3329
  193. package/dist/index.cjs.map +1 -1
  194. package/dist/index.d.ts +3 -0
  195. package/dist/index.esm.js +3719 -3330
  196. package/dist/index.esm.js.map +1 -1
  197. package/dist/index.iife.js +3721 -3329
  198. package/dist/index.iife.js.map +1 -1
  199. package/dist/keyboard-filter.d.ts +25 -0
  200. package/dist/on.d.ts +1 -1
  201. package/dist/parts.d.ts +0 -17
  202. package/dist/react/SniceProvider.js +2 -2
  203. package/dist/react/SniceRouter.js +2 -2
  204. package/dist/react/index.js +2 -2
  205. package/dist/react/matchRoute.js +2 -2
  206. package/dist/react/useRequestHandler.js +2 -2
  207. package/dist/request-response.d.ts +9 -1
  208. package/dist/symbols.cjs +11 -2
  209. package/dist/symbols.cjs.map +1 -1
  210. package/dist/symbols.d.ts +3 -0
  211. package/dist/symbols.esm.js +9 -3
  212. package/dist/symbols.esm.js.map +1 -1
  213. package/dist/testing.d.ts +1 -1
  214. package/dist/transitions.cjs +2 -2
  215. package/dist/transitions.esm.js +2 -2
  216. package/dist/types/app-context.d.ts +9 -58
  217. package/dist/types/daemon.d.ts +8 -0
  218. package/dist/types/dispatch-options.d.ts +2 -0
  219. package/dist/types/index.d.ts +1 -0
  220. package/dist/types/on-options.d.ts +5 -0
  221. package/dist/types/request-options.d.ts +2 -0
  222. package/dist/types/respond-options.d.ts +2 -0
  223. package/docs/ai/DEVELOPMENT.md +15 -1
  224. package/docs/ai/README.md +5 -1
  225. package/docs/ai/api.md +13 -4
  226. package/docs/ai/architecture.md +50 -1
  227. package/docs/ai/cli.md +9 -0
  228. package/docs/ai/components/avatar.md +8 -8
  229. package/docs/ai/components/breadcrumbs.md +2 -1
  230. package/docs/ai/components/button.md +2 -7
  231. package/docs/ai/components/calendar.md +1 -1
  232. package/docs/ai/components/camera.md +1 -1
  233. package/docs/ai/components/chart.md +3 -1
  234. package/docs/ai/components/code-block.md +2 -2
  235. package/docs/ai/components/date-picker.md +5 -19
  236. package/docs/ai/components/date-range-picker.md +4 -12
  237. package/docs/ai/components/draw.md +5 -5
  238. package/docs/ai/components/drawer.md +4 -4
  239. package/docs/ai/components/form-layout.md +2 -0
  240. package/docs/ai/components/icons.md +7 -16
  241. package/docs/ai/components/key-value.md +3 -22
  242. package/docs/ai/components/layout.md +8 -12
  243. package/docs/ai/components/leaderboard.md +2 -2
  244. package/docs/ai/components/link-preview.md +4 -3
  245. package/docs/ai/components/login.md +11 -0
  246. package/docs/ai/components/markdown.md +7 -0
  247. package/docs/ai/components/masonry.md +6 -0
  248. package/docs/ai/components/menu.md +1 -1
  249. package/docs/ai/components/modal.md +7 -0
  250. package/docs/ai/components/notification-center.md +5 -4
  251. package/docs/ai/components/radio.md +7 -0
  252. package/docs/ai/components/rating.md +3 -3
  253. package/docs/ai/components/select.md +4 -13
  254. package/docs/ai/components/spotlight.md +2 -0
  255. package/docs/ai/components/table.md +1 -4
  256. package/docs/ai/components/tag-input.md +6 -0
  257. package/docs/ai/components/terminal.md +6 -0
  258. package/docs/ai/components/tooltip.md +10 -16
  259. package/docs/ai/components/tree.md +2 -2
  260. package/docs/ai/components/video-player.md +5 -0
  261. package/docs/ai/components/waterfall.md +7 -0
  262. package/docs/ai/daemons.md +80 -0
  263. package/docs/ai/decorators.md +6 -4
  264. package/docs/ai/events.md +35 -0
  265. package/docs/ai/patterns.md +45 -1
  266. package/docs/ai/request-response.md +26 -9
  267. package/docs/ai/routing.md +16 -1
  268. package/docs/cli.md +7 -0
  269. package/docs/components/breadcrumbs.md +2 -1
  270. package/docs/components/calendar.md +1 -1
  271. package/docs/components/camera.md +1 -1
  272. package/docs/components/chart.md +1 -1
  273. package/docs/components/code-block.md +13 -4
  274. package/docs/components/color-picker.md +6 -5
  275. package/docs/components/date-time-picker.md +14 -0
  276. package/docs/components/diff.md +2 -1
  277. package/docs/components/draw.md +5 -5
  278. package/docs/components/drawer.md +4 -4
  279. package/docs/components/input.md +1 -0
  280. package/docs/components/layout.md +20 -22
  281. package/docs/components/leaderboard.md +10 -3
  282. package/docs/components/link-preview.md +11 -9
  283. package/docs/components/login.md +4 -0
  284. package/docs/components/menu.md +1 -1
  285. package/docs/components/modal.md +1 -0
  286. package/docs/components/nav.md +1 -0
  287. package/docs/components/network-graph.md +1 -0
  288. package/docs/components/notification-center.md +2 -1
  289. package/docs/components/product-card.md +1 -0
  290. package/docs/components/qr-reader.md +1 -0
  291. package/docs/components/rating.md +4 -4
  292. package/docs/components/select.md +1 -0
  293. package/docs/components/spotlight.md +2 -0
  294. package/docs/components/tabs.md +1 -0
  295. package/docs/components/terminal.md +3 -0
  296. package/docs/components/textarea.md +1 -1
  297. package/docs/components/time-picker.md +14 -0
  298. package/docs/components/tooltip.md +2 -0
  299. package/docs/components/tree.md +2 -2
  300. package/docs/daemons.md +200 -0
  301. package/docs/events.md +92 -2
  302. package/docs/request-response.md +20 -13
  303. package/docs/routing.md +25 -1
  304. package/package.json +6 -4
@@ -1,11 +1,11 @@
1
1
  /*!
2
- * snice v7.0.2
3
- * A decorator-driven web component library with differential rendering, routing, controllers, and 130+ ready-made UI components. Use as much or as little as you want. Zero dependencies, works anywhere.
2
+ * snice v7.1.0
3
+ * A decorator-driven web component library with routing, controllers, daemons, and 130+ UI components. For better coding-agent results, run npx snice init-ai.
4
4
  * (c) 2024
5
5
  * Released under the MIT License.
6
6
  */
7
7
  if(typeof globalThis.Snice==="undefined"){console.warn("[snice] snice-runtime.min.js must be loaded before snice-layout.min.js");}
8
- var SniceLayout = (function (exports, snice) {
8
+ (function (snice) {
9
9
  'use strict';
10
10
 
11
11
  /******************************************************************************
@@ -251,8 +251,55 @@ var SniceLayout = (function (exports, snice) {
251
251
  return { kind: 'registry', value: icon };
252
252
  return { kind: 'text', value: icon };
253
253
  }
254
+ /**
255
+ * Detects icon type and returns appropriate template
256
+ *
257
+ * Scheme overrides:
258
+ * - img://path -> forces <img> element
259
+ * - text://content -> forces text content
260
+ *
261
+ * Auto-detection (when no scheme):
262
+ * - URLs (http://, https://, /, ./, ../, data:) -> <img>
263
+ * - Image extensions (svg, png, jpg, jpeg, jfif, pjp, gif, webp, avif, jxl,
264
+ * ico, cur, bmp, tif, tiff, heic, heif, apng) -> <img>
265
+ * - Everything else -> span with text content (emoji, plain text)
266
+ *
267
+ * ⚠️ "home" or "settings" renders as PLAIN TEXT, not a Material icon.
268
+ * For Material Symbols, use the icon slot instead:
269
+ * <span slot="icon" class="material-symbols-outlined">home</span>
270
+ *
271
+ * Examples:
272
+ * - "/path/icon.svg" -> <img>
273
+ * - "icon.png" -> <img>
274
+ * - "img://filename" -> <img> (forced)
275
+ * - "🏠" -> <span> text (emoji)
276
+ * - "home" -> <span> text (plain text, NOT a Material icon)
277
+ * - "text:///not/a/path" -> <span> text (forced)
278
+ */
279
+ function renderIcon(icon, className = 'icon') {
280
+ if (!icon)
281
+ return snice.html ``;
282
+ const { kind, value } = classifyIcon(icon);
283
+ if (kind === 'img') {
284
+ return snice.html `<img class="${className}" src="${value}" alt="" part="icon" />`;
285
+ }
286
+ // Built-in SVG registry (components/icons) — named icons resolve here
287
+ // BEFORE the font-ligature fallback. Without this, names like 'search'
288
+ // render as literal text unless an external icon font is loaded.
289
+ if (kind === 'registry') {
290
+ return snice.html `<span class="${className}" part="icon">${snice.unsafeHTML(ICONS[value])}</span>`;
291
+ }
292
+ // Default: text content (emoji, font icon ligature names)
293
+ // All content is escaped - no HTML injection possible
294
+ // Detect ligature icon names (lowercase words with underscores, e.g. "search", "check_circle")
295
+ // vs emoji/other text — apply --snice-icon-font (defaults to Material Symbols Outlined)
296
+ if (/^[a-z][a-z0-9_]*$/.test(value)) {
297
+ return snice.html `<span class="${className} snice-icon-ligature" style="font-family:var(--snice-icon-font,'Material Symbols Outlined'),sans-serif" part="icon">${value}</span>`;
298
+ }
299
+ return snice.html `<span class="${className}" part="icon">${value}</span>`;
300
+ }
254
301
 
255
- var cssContent$1 = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);overflow:hidden;box-sizing:border-box}.nav{display:flex;gap:var(--snice-spacing-md,1rem)}.nav--horizontal{flex-direction:row;align-items:center}.nav--vertical{flex-direction:column;align-items:stretch}.nav__item{position:relative}.nav__link{display:flex;align-items:center;gap:var(--snice-spacing-sm,.75rem);padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-md,1rem);color:var(--snice-color-text-secondary,rgb(107 114 128));text-decoration:none;border-radius:var(--snice-border-radius-md,.375rem);font-size:var(--snice-font-size-md, 1rem);font-weight:var(--snice-font-weight-medium,500);box-sizing:border-box;min-width:0;position:relative;transition:background-color var(--snice-transition-fast, 150ms) var(--snice-ease-out, ease),color var(--snice-transition-fast, 150ms) var(--snice-ease-out, ease)}.nav__link:hover{background-color:var(--snice-color-surface-container-low,rgb(243 244 246));color:var(--snice-color-text,rgb(23 23 23))}.nav__link:focus-visible{outline:var(--snice-focus-ring-width,2px) solid var(--snice-focus-ring-color,rgb(59 130 246 / .5));outline-offset:var(--snice-focus-ring-offset,2px)}.nav__link--active{background-color:var(--snice-color-surface-container,rgb(243 244 246));color:var(--snice-color-primary-hover,rgb(96 165 250))}.nav__link--active:hover{background-color:var(--snice-color-surface-container-low,rgb(249 250 251));color:var(--snice-color-primary-hover,rgb(29 78 216))}:host([active-style=text]) .nav__link,:host([active-style=text]) .nav__link--active,:host([active-style=text]) .nav__link--active:hover,:host([active-style=text]) .nav__link:hover{background-color:transparent}:host([active-style=text]) .nav__link:hover{color:color-mix(in srgb,var(--snice-color-primary,rgb(37 99 235)) 60%,transparent)}:host([active-style=text]) .nav__link--active{color:var(--snice-color-primary-hover,rgb(29 78 216))}:host([active-style=text]) .nav__link--active:hover{color:var(--snice-color-primary-hover,rgb(29 78 216))}:host([active-style=text]) .nav__link::after{content:'';position:absolute;background:var(--snice-color-primary,rgb(37 99 235));left:50%;right:50%;bottom:2px;height:2px;border-radius:1px;transition:left 220ms var(--snice-ease-out, ease),right 220ms var(--snice-ease-out, ease),background-color 220ms var(--snice-ease-out, ease);pointer-events:none}:host([active-style=text]) .nav__link:hover::after{left:20%;right:20%}:host([active-style=text]) .nav__link--active::after{left:0;right:0}:host([active-style=text][orientation=vertical]) .nav__link::after{left:0;right:auto;bottom:20%;top:20%;width:2px;height:auto;transform:scaleY(0);transform-origin:center;transition:transform 220ms var(--snice-ease-out, ease),background-color 220ms var(--snice-ease-out, ease)}:host([active-style=text][orientation=vertical]) .nav__link:hover::after{transform:scaleY(.6)}:host([active-style=text][orientation=vertical]) .nav__link--active::after{top:15%;bottom:15%;transform:scaleY(1)}.nav__icon{display:inline-flex;align-items:center;justify-content:center;font-size:var(--snice-font-size-lg, 1.125rem)}.nav__icon svg{width:1.125rem;height:1.125rem;display:block}.nav__icon img{width:1.25em;height:1.25em;object-fit:contain}.nav__label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nav--hierarchical.nav--vertical{flex-direction:column;gap:var(--snice-spacing-xs,.5rem)}.nav--hierarchical.nav--horizontal{flex-direction:row;align-items:flex-start;gap:var(--snice-spacing-lg,1.5rem)}.nav--hierarchical .nav__group{display:flex;flex-direction:column;gap:var(--snice-spacing-xs,.5rem)}.nav--hierarchical .nav__submenu{list-style:none;margin:0;padding:0 0 0 var(--snice-spacing-xl,2rem);display:flex;flex-direction:column;gap:var(--snice-spacing-2xs,.25rem)}.nav--hierarchical .nav__submenu .nav__item{margin:0}.nav--hierarchical .nav__submenu .nav__link{font-size:var(--snice-font-size-sm, .875rem);padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-md,1rem)}.nav--grouped.nav--vertical{flex-direction:column;gap:var(--snice-spacing-lg,1.5rem)}.nav--grouped.nav--horizontal{flex-direction:row;align-items:flex-start;gap:var(--snice-spacing-xl,2rem)}.nav--grouped .nav__group{display:flex;flex-direction:column;gap:var(--snice-spacing-xs,.5rem)}.nav--grouped .nav__group-label{font-size:var(--snice-font-size-xs, .75rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text-tertiary,rgb(115 115 115));text-transform:uppercase;letter-spacing:var(--snice-tracking-wide, .03em);padding:0 var(--snice-spacing-md,1rem);margin-bottom:var(--snice-spacing-2xs,.25rem)}.nav--vertical .nav__item,.nav--vertical .nav__link{width:100%}@media (max-width:768px){.nav--horizontal{flex-wrap:wrap}.nav__label{font-size:var(--snice-font-size-sm, .875rem)}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
302
+ var cssContent$e = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);overflow:hidden;box-sizing:border-box}.nav{display:flex;gap:var(--snice-spacing-md,1rem)}.nav--horizontal{flex-direction:row;align-items:center}.nav--vertical{flex-direction:column;align-items:stretch}.nav__item{position:relative}.nav__link{display:flex;align-items:center;gap:var(--snice-spacing-sm,.75rem);padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-md,1rem);color:var(--snice-color-text-secondary,rgb(107 114 128));text-decoration:none;border-radius:var(--snice-border-radius-md,.375rem);font-size:var(--snice-font-size-md, 1rem);font-weight:var(--snice-font-weight-medium,500);box-sizing:border-box;min-width:0;position:relative;transition:background-color var(--snice-transition-fast, 150ms) var(--snice-ease-out, ease),color var(--snice-transition-fast, 150ms) var(--snice-ease-out, ease)}.nav__link:hover{background-color:var(--snice-color-surface-container-low,rgb(243 244 246));color:var(--snice-color-text,rgb(23 23 23))}.nav__link:focus-visible{outline:var(--snice-focus-ring-width,2px) solid var(--snice-focus-ring-color,rgb(59 130 246 / .5));outline-offset:var(--snice-focus-ring-offset,2px)}.nav__link--active{background-color:var(--snice-color-surface-container,rgb(243 244 246));color:var(--snice-color-primary-hover,rgb(96 165 250))}.nav__link--active:hover{background-color:var(--snice-color-surface-container-low,rgb(249 250 251));color:var(--snice-color-primary-hover,rgb(29 78 216))}:host([active-style=text]) .nav__link,:host([active-style=text]) .nav__link--active,:host([active-style=text]) .nav__link--active:hover,:host([active-style=text]) .nav__link:hover{background-color:transparent}:host([active-style=text]) .nav__link:hover{color:color-mix(in srgb,var(--snice-color-primary,rgb(37 99 235)) 60%,transparent)}:host([active-style=text]) .nav__link--active{color:var(--snice-color-primary-hover,rgb(29 78 216))}:host([active-style=text]) .nav__link--active:hover{color:var(--snice-color-primary-hover,rgb(29 78 216))}:host([active-style=text]) .nav__link::after{content:'';position:absolute;background:var(--snice-color-primary,rgb(37 99 235));left:50%;right:50%;bottom:2px;height:2px;border-radius:1px;transition:left 220ms var(--snice-ease-out, ease),right 220ms var(--snice-ease-out, ease),background-color 220ms var(--snice-ease-out, ease);pointer-events:none}:host([active-style=text]) .nav__link:hover::after{left:20%;right:20%}:host([active-style=text]) .nav__link--active::after{left:0;right:0}:host([active-style=text][orientation=vertical]) .nav__link::after{left:0;right:auto;bottom:20%;top:20%;width:2px;height:auto;transform:scaleY(0);transform-origin:center;transition:transform 220ms var(--snice-ease-out, ease),background-color 220ms var(--snice-ease-out, ease)}:host([active-style=text][orientation=vertical]) .nav__link:hover::after{transform:scaleY(.6)}:host([active-style=text][orientation=vertical]) .nav__link--active::after{top:15%;bottom:15%;transform:scaleY(1)}.nav__icon{display:inline-flex;align-items:center;justify-content:center;font-size:var(--snice-font-size-lg, 1.125rem)}.nav__icon svg{width:1.125rem;height:1.125rem;display:block}.nav__icon img{width:1.25em;height:1.25em;object-fit:contain}.nav__label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nav--hierarchical.nav--vertical{flex-direction:column;gap:var(--snice-spacing-xs,.5rem)}.nav--hierarchical.nav--horizontal{flex-direction:row;align-items:flex-start;gap:var(--snice-spacing-lg,1.5rem)}.nav--hierarchical .nav__group{display:flex;flex-direction:column;gap:var(--snice-spacing-xs,.5rem)}.nav--hierarchical .nav__submenu{list-style:none;margin:0;padding:0 0 0 var(--snice-spacing-xl,2rem);display:flex;flex-direction:column;gap:var(--snice-spacing-2xs,.25rem)}.nav--hierarchical .nav__submenu .nav__item{margin:0}.nav--hierarchical .nav__submenu .nav__link{font-size:var(--snice-font-size-sm, .875rem);padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-md,1rem)}.nav--grouped.nav--vertical{flex-direction:column;gap:var(--snice-spacing-lg,1.5rem)}.nav--grouped.nav--horizontal{flex-direction:row;align-items:flex-start;gap:var(--snice-spacing-xl,2rem)}.nav--grouped .nav__group{display:flex;flex-direction:column;gap:var(--snice-spacing-xs,.5rem)}.nav--grouped .nav__group-label{font-size:var(--snice-font-size-xs, .75rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text-tertiary,rgb(115 115 115));text-transform:uppercase;letter-spacing:var(--snice-tracking-wide, .03em);padding:0 var(--snice-spacing-md,1rem);margin-bottom:var(--snice-spacing-2xs,.25rem)}.nav--vertical .nav__item,.nav--vertical .nav__link{width:100%}@media (max-width:768px){.nav--horizontal{flex-wrap:wrap}.nav__label{font-size:var(--snice-font-size-sm, .875rem)}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
256
303
 
257
304
  const NAME_KEY = 'data-placard-name';
258
305
  const GROUP_KEY = 'data-group';
@@ -333,7 +380,7 @@ var SniceLayout = (function (exports, snice) {
333
380
  if (this.shadowRoot.querySelector('style'))
334
381
  return;
335
382
  const style = document.createElement('style');
336
- style.textContent = cssContent$1;
383
+ style.textContent = cssContent$e;
337
384
  this.shadowRoot.appendChild(style);
338
385
  }
339
386
  render() {
@@ -829,9 +876,9 @@ var SniceLayout = (function (exports, snice) {
829
876
  return _classThis;
830
877
  })();
831
878
 
832
- var cssContent = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);min-height:100vh;min-height:100dvh}:host([contained]){min-height:0}.layout{display:grid;grid-template-rows:auto 1fr auto;min-height:inherit}.header{display:flex;align-items:center;justify-content:space-between;padding:var(--snice-spacing-md,1rem) var(--snice-spacing-lg,2rem);background:var(--snice-color-surface,rgb(255 255 255));border-bottom:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));box-shadow:var(--snice-shadow-xs,0 1px 2px 0 rgb(0 0 0 / .05))}.brand h1{font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);margin:0;font-size:var(--snice-heading-lg, 1.5rem);color:var(--snice-color-text,rgb(23 23 23));font-weight:var(--snice-font-weight-semibold,600)}.nav{display:flex;gap:var(--snice-spacing-lg,2rem)}.nav ::slotted(a){text-decoration:none;color:var(--snice-color-text-secondary,rgb(82 82 82));font-weight:var(--snice-font-weight-medium,500);padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-md,1rem);border-radius:var(--snice-border-radius-md,4px);transition:all var(--snice-transition-fast, .15s) ease}.nav ::slotted(a:hover){color:var(--snice-color-primary,rgb(37 99 235));background:var(--snice-color-surface-container-low,rgb(250 250 250))}.nav ::slotted(a.active){color:var(--snice-color-primary,rgb(37 99 235));background:var(--snice-color-primary-subtle,rgb(239 246 255));font-weight:var(--snice-font-weight-semibold,600)}.main{padding:var(--snice-spacing-lg,2rem);background:var(--snice-color-surface-container-low,rgb(250 250 250));overflow-y:auto;position:relative;z-index:0}.footer{padding:var(--snice-spacing-md,1rem) var(--snice-spacing-lg,2rem);background:var(--snice-color-surface,rgb(255 255 255));border-top:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));text-align:center;color:var(--snice-color-text-secondary,rgb(82 82 82));font-size:var(--snice-font-size-sm, .875rem)}.footer p{margin:0}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}.footer--empty{display:none}";
879
+ var cssContent$d = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);min-height:100vh;min-height:100dvh}:host([contained]){min-height:0}.layout{display:grid;grid-template-rows:auto 1fr auto;min-height:inherit}.header{display:flex;align-items:center;justify-content:space-between;padding:var(--snice-spacing-md,1rem) var(--snice-spacing-lg,2rem);background:var(--snice-color-surface,rgb(255 255 255));border-bottom:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));box-shadow:var(--snice-shadow-xs,0 1px 2px 0 rgb(0 0 0 / .05))}.brand h1{font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);margin:0;font-size:var(--snice-heading-lg, 1.5rem);color:var(--snice-color-text,rgb(23 23 23));font-weight:var(--snice-font-weight-semibold,600)}.nav{display:flex;gap:var(--snice-spacing-lg,2rem)}.nav ::slotted(a){text-decoration:none;color:var(--snice-color-text-secondary,rgb(82 82 82));font-weight:var(--snice-font-weight-medium,500);padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-md,1rem);border-radius:var(--snice-border-radius-md,4px);transition:all var(--snice-transition-fast, .15s) ease}.nav ::slotted(a:hover){color:var(--snice-color-primary,rgb(37 99 235));background:var(--snice-color-surface-container-low,rgb(250 250 250))}.nav ::slotted(a.active){color:var(--snice-color-primary,rgb(37 99 235));background:var(--snice-color-primary-subtle,rgb(239 246 255));font-weight:var(--snice-font-weight-semibold,600)}.main{padding:var(--snice-spacing-lg,2rem);background:var(--snice-color-surface-container-low,rgb(250 250 250));overflow-y:auto;position:relative;z-index:0}.footer{padding:var(--snice-spacing-md,1rem) var(--snice-spacing-lg,2rem);background:var(--snice-color-surface,rgb(255 255 255));border-top:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));text-align:center;color:var(--snice-color-text-secondary,rgb(82 82 82));font-size:var(--snice-font-size-sm, .875rem)}.footer p{margin:0}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}.footer--empty{display:none}";
833
880
 
834
- let SniceLayout = (() => {
881
+ (() => {
835
882
  let _classDecorators = [snice.element('snice-layout')];
836
883
  let _classDescriptor;
837
884
  let _classExtraInitializers = [];
@@ -893,7 +940,7 @@ var SniceLayout = (function (exports, snice) {
893
940
  `;
894
941
  }
895
942
  styles() {
896
- return snice.css /*css*/ `${cssContent}`;
943
+ return snice.css /*css*/ `${cssContent$d}`;
897
944
  }
898
945
  wireFooterState() {
899
946
  this.syncFooterState();
@@ -933,9 +980,1607 @@ var SniceLayout = (function (exports, snice) {
933
980
  return _classThis;
934
981
  })();
935
982
 
936
- exports.SniceLayout = SniceLayout;
983
+ var cssContent$c = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);min-height:100vh;min-height:100dvh}:host([contained]){min-height:0}.layout{display:grid;grid-template-columns:1fr 1fr;min-height:inherit;height:100%;background:var(--snice-color-surface,rgb(255 255 255))}:host([panel-position=start]) .layout{grid-template-areas:\"panel form\"}:host([panel-position=start]) .form-side{grid-area:form}.form-side{display:flex;align-items:center;justify-content:center;padding:var(--snice-spacing-xl,2rem)}.form-inner{width:100%;max-width:var(--snice-layout-auth-width,24rem);display:flex;flex-direction:column;gap:var(--snice-spacing-lg,1.5rem)}.brand{font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);font-size:var(--snice-heading-md, 1.125rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text,rgb(23 23 23))}.brand:not(:has(::slotted(*))){display:block}.footer{font-size:var(--snice-font-size-sm, .875rem);color:var(--snice-color-text-secondary,rgb(82 82 82))}.panel{display:flex;align-items:center;justify-content:center;overflow:hidden;background:var(--snice-layout-auth-panel-bg,var(--snice-color-surface-container,hsl(0 0% 95%)));border-left:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)))}:host([panel-position=start]) .panel{grid-area:panel;border-left:none;border-right:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)))}.panel ::slotted(img),.panel ::slotted(picture),.panel ::slotted(video){width:100%;height:100%;object-fit:cover}@media (max-width:768px){.layout{grid-template-columns:1fr;grid-template-areas:\"form\"}.panel{display:none}.form-side{padding:var(--snice-spacing-lg,1.5rem)}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
984
+
985
+ /**
986
+ * Split authentication page: the form on one side, brand imagery on the other.
987
+ *
988
+ * The brand panel is decorative. Below the breakpoint it steps aside and the
989
+ * form takes the full width, which is what sign-in pages do everywhere.
990
+ */
991
+ (() => {
992
+ let _classDecorators = [snice.element('snice-layout-auth-split')];
993
+ let _classDescriptor;
994
+ let _classExtraInitializers = [];
995
+ let _classThis;
996
+ let _classSuper = HTMLElement;
997
+ let _instanceExtraInitializers = [];
998
+ let _panelPosition_decorators;
999
+ let _panelPosition_initializers = [];
1000
+ let _panelPosition_extraInitializers = [];
1001
+ let _contained_decorators;
1002
+ let _contained_initializers = [];
1003
+ let _contained_extraInitializers = [];
1004
+ let _render_decorators;
1005
+ let _styles_decorators;
1006
+ (class extends _classSuper {
1007
+ static { _classThis = this; }
1008
+ static {
1009
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
1010
+ _panelPosition_decorators = [snice.property({ attribute: 'panel-position' })];
1011
+ _contained_decorators = [snice.property({ type: Boolean })];
1012
+ _render_decorators = [snice.render()];
1013
+ _styles_decorators = [snice.styles()];
1014
+ __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
1015
+ __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
1016
+ __esDecorate(null, null, _panelPosition_decorators, { kind: "field", name: "panelPosition", static: false, private: false, access: { has: obj => "panelPosition" in obj, get: obj => obj.panelPosition, set: (obj, value) => { obj.panelPosition = value; } }, metadata: _metadata }, _panelPosition_initializers, _panelPosition_extraInitializers);
1017
+ __esDecorate(null, null, _contained_decorators, { kind: "field", name: "contained", static: false, private: false, access: { has: obj => "contained" in obj, get: obj => obj.contained, set: (obj, value) => { obj.contained = value; } }, metadata: _metadata }, _contained_initializers, _contained_extraInitializers);
1018
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
1019
+ _classThis = _classDescriptor.value;
1020
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
1021
+ __runInitializers(_classThis, _classExtraInitializers);
1022
+ }
1023
+ render() {
1024
+ return snice.html /*html*/ `
1025
+ <div class="layout">
1026
+ <section class="form-side" part="form">
1027
+ <div class="form-inner">
1028
+ <div class="brand" part="brand">
1029
+ <slot name="brand"></slot>
1030
+ </div>
1031
+
1032
+ <div class="form-body" part="page">
1033
+ <slot name="page"></slot>
1034
+ </div>
1035
+
1036
+ <div class="footer" part="footer">
1037
+ <slot name="footer"></slot>
1038
+ </div>
1039
+ </div>
1040
+ </section>
1041
+
1042
+ <aside class="panel" part="panel" aria-hidden="true">
1043
+ <slot name="panel"></slot>
1044
+ </aside>
1045
+ </div>
1046
+ `;
1047
+ }
1048
+ styles() {
1049
+ return snice.css /*css*/ `${cssContent$c}`;
1050
+ }
1051
+ constructor() {
1052
+ super(...arguments);
1053
+ /** Which side the brand panel sits on. */
1054
+ this.panelPosition = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _panelPosition_initializers, 'end'));
1055
+ /** Size to the parent element instead of filling the screen. */
1056
+ this.contained = (__runInitializers(this, _panelPosition_extraInitializers), __runInitializers(this, _contained_initializers, false));
1057
+ __runInitializers(this, _contained_extraInitializers);
1058
+ }
1059
+ });
1060
+ return _classThis;
1061
+ })();
1062
+
1063
+ var cssContent$b = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);min-height:100vh;min-height:100dvh}:host([contained]){min-height:0}.layout{min-height:inherit;display:grid;grid-template-rows:auto 1fr auto}.container{max-width:68rem;margin:0 auto;padding:0 var(--snice-spacing-lg,1.5rem)}.header{background:var(--snice-color-surface,rgb(255 255 255));border-bottom:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));padding:var(--snice-spacing-md,1rem) 0}.header .container{display:flex;align-items:center;justify-content:space-between}.brand h1{font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);margin:0;font-size:var(--snice-heading-lg, 1.5rem);font-weight:var(--snice-font-weight-bold,700);color:var(--snice-color-text,rgb(23 23 23))}.nav{display:flex;gap:var(--snice-spacing-lg,2rem)}.nav ::slotted(a){text-decoration:none;color:var(--snice-color-text-secondary,rgb(82 82 82));font-weight:var(--snice-font-weight-medium,500);transition:color var(--snice-transition-fast, .15s) ease}.nav ::slotted(a:hover){color:var(--snice-color-primary,rgb(37 99 235))}.main{background:var(--snice-color-surface,rgb(255 255 255));padding:var(--snice-spacing-xl,3rem) 0}.content-area{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--snice-spacing-2xl,3rem);align-items:start}.content-area--with-sidebar{grid-template-columns:minmax(0,1fr) 18rem}.article{max-width:var(--snice-layout-measure,65ch);margin-inline:auto;width:100%}.content-area--with-sidebar .article{justify-self:end;margin-inline:0}.sidebar{background:var(--snice-color-surface-container-high,rgb(252 251 249));border:1px solid var(--snice-color-border-subtle,transparent);border-radius:var(--snice-border-radius-lg,.5rem);padding:var(--snice-spacing-lg,1.5rem);position:sticky;top:var(--snice-spacing-lg,1.5rem)}.sidebar--empty{display:none}.footer{background:var(--snice-color-surface-container,hsl(0 0% 95%));border-top:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));padding:var(--snice-spacing-xl,3rem) 0}.article ::slotted(h1){font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);font-size:var(--snice-heading-2xl, 2.25rem);font-weight:var(--snice-font-weight-bold,700);color:var(--snice-color-text,rgb(23 23 23));line-height:var(--snice-line-height-tight, 1.25);margin-bottom:var(--snice-spacing-lg,2rem)}.article ::slotted(h2){font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);font-size:var(--snice-heading-xl, 1.875rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text,rgb(23 23 23));margin-top:var(--snice-spacing-xl,3rem);margin-bottom:var(--snice-spacing-md,1rem)}.article ::slotted(p){font-size:var(--snice-font-size-base, 1rem);line-height:var(--snice-line-height-relaxed, 1.625);color:var(--snice-color-text,rgb(23 23 23));margin-bottom:var(--snice-spacing-md,1rem)}@media (max-width:968px){.content-area,.content-area--with-sidebar{grid-template-columns:1fr;gap:var(--snice-spacing-xl,3rem)}.content-area--with-sidebar .article{justify-self:stretch;margin-inline:auto}.sidebar{position:static}}@media (max-width:768px){.header .container{flex-direction:column;gap:var(--snice-spacing-md,1rem)}.main{padding:var(--snice-spacing-lg,2rem) 0}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
1064
+
1065
+ (() => {
1066
+ let _classDecorators = [snice.element('snice-layout-blog')];
1067
+ let _classDescriptor;
1068
+ let _classExtraInitializers = [];
1069
+ let _classThis;
1070
+ let _classSuper = HTMLElement;
1071
+ let _instanceExtraInitializers = [];
1072
+ let _navElement_decorators;
1073
+ let _navElement_initializers = [];
1074
+ let _navElement_extraInitializers = [];
1075
+ let _useNav_decorators;
1076
+ let _useNav_initializers = [];
1077
+ let _useNav_extraInitializers = [];
1078
+ let _hasSidebar_decorators;
1079
+ let _hasSidebar_initializers = [];
1080
+ let _hasSidebar_extraInitializers = [];
1081
+ let _render_decorators;
1082
+ let _styles_decorators;
1083
+ let _wireSlotDetection_decorators;
1084
+ (class extends _classSuper {
1085
+ static { _classThis = this; }
1086
+ constructor() {
1087
+ super(...arguments);
1088
+ this.navElement = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _navElement_initializers, void 0));
1089
+ this.useNav = (__runInitializers(this, _navElement_extraInitializers), __runInitializers(this, _useNav_initializers, false));
1090
+ this.hasSidebar = (__runInitializers(this, _useNav_extraInitializers), __runInitializers(this, _hasSidebar_initializers, false));
1091
+ this.placards = (__runInitializers(this, _hasSidebar_extraInitializers), []);
1092
+ this.currentRoute = '';
1093
+ }
1094
+ static {
1095
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
1096
+ _navElement_decorators = [snice.query('snice-nav')];
1097
+ _useNav_decorators = [snice.property({ type: Boolean, attribute: 'use-nav' })];
1098
+ _hasSidebar_decorators = [snice.property({ attribute: false })];
1099
+ _render_decorators = [snice.render()];
1100
+ _styles_decorators = [snice.styles()];
1101
+ _wireSlotDetection_decorators = [snice.ready()];
1102
+ __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
1103
+ __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
1104
+ __esDecorate(this, null, _wireSlotDetection_decorators, { kind: "method", name: "wireSlotDetection", static: false, private: false, access: { has: obj => "wireSlotDetection" in obj, get: obj => obj.wireSlotDetection }, metadata: _metadata }, null, _instanceExtraInitializers);
1105
+ __esDecorate(null, null, _navElement_decorators, { kind: "field", name: "navElement", static: false, private: false, access: { has: obj => "navElement" in obj, get: obj => obj.navElement, set: (obj, value) => { obj.navElement = value; } }, metadata: _metadata }, _navElement_initializers, _navElement_extraInitializers);
1106
+ __esDecorate(null, null, _useNav_decorators, { kind: "field", name: "useNav", static: false, private: false, access: { has: obj => "useNav" in obj, get: obj => obj.useNav, set: (obj, value) => { obj.useNav = value; } }, metadata: _metadata }, _useNav_initializers, _useNav_extraInitializers);
1107
+ __esDecorate(null, null, _hasSidebar_decorators, { kind: "field", name: "hasSidebar", static: false, private: false, access: { has: obj => "hasSidebar" in obj, get: obj => obj.hasSidebar, set: (obj, value) => { obj.hasSidebar = value; } }, metadata: _metadata }, _hasSidebar_initializers, _hasSidebar_extraInitializers);
1108
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
1109
+ _classThis = _classDescriptor.value;
1110
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
1111
+ __runInitializers(_classThis, _classExtraInitializers);
1112
+ }
1113
+ render() {
1114
+ return snice.html /*html*/ `
1115
+ <div class="layout">
1116
+ <header class="header">
1117
+ <div class="container">
1118
+ <div class="brand">
1119
+ <slot name="brand">
1120
+ <h1>Blog</h1>
1121
+ </slot>
1122
+ </div>
1123
+ <if ${this.useNav}>
1124
+ <snice-nav class="nav" variant="flat" orientation="horizontal"></snice-nav>
1125
+ </if>
1126
+ <if ${!this.useNav}>
1127
+ <nav class="nav">
1128
+ <slot name="nav"></slot>
1129
+ </nav>
1130
+ </if>
1131
+ </div>
1132
+ </header>
1133
+
1134
+ <main class="main">
1135
+ <div class="container">
1136
+ <div class="content-area${this.hasSidebar ? ' content-area--with-sidebar' : ''}">
1137
+ <article class="article">
1138
+ <slot name="page"></slot>
1139
+ </article>
1140
+
1141
+ <aside class="sidebar${this.hasSidebar ? '' : ' sidebar--empty'}">
1142
+ <slot name="sidebar"></slot>
1143
+ </aside>
1144
+ </div>
1145
+ </div>
1146
+ </main>
1147
+
1148
+ <footer class="footer">
1149
+ <div class="container">
1150
+ <slot name="footer"></slot>
1151
+ </div>
1152
+ </footer>
1153
+ </div>
1154
+ `;
1155
+ }
1156
+ styles() {
1157
+ return snice.css /*css*/ `${cssContent$b}`;
1158
+ }
1159
+ wireSlotDetection() {
1160
+ this.syncSlotState();
1161
+ this.shadowRoot?.addEventListener('slotchange', () => this.syncSlotState());
1162
+ }
1163
+ syncSlotState() {
1164
+ this.hasSidebar = !!this.querySelector('[slot="sidebar"]');
1165
+ }
1166
+ update(appContext, placards, currentRoute, routeParams) {
1167
+ this.placards = placards;
1168
+ this.currentRoute = currentRoute;
1169
+ this.useNav = true;
1170
+ this.updateNav(appContext, routeParams);
1171
+ }
1172
+ updateNav(appContext, routeParams) {
1173
+ if (this.navElement) {
1174
+ this.navElement.update(this.placards, appContext, this.currentRoute, routeParams);
1175
+ }
1176
+ }
1177
+ });
1178
+ return _classThis;
1179
+ })();
1180
+
1181
+ var cssContent$a = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);min-height:100vh;min-height:100dvh}:host([contained]){min-height:0}.layout{min-height:inherit;display:grid;grid-template-rows:auto 1fr auto;background:var(--snice-color-surface,rgb(255 255 255))}.header{background:var(--snice-color-surface-container-high,rgb(252 251 249));border-bottom:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));padding:var(--snice-spacing-md,1rem) var(--snice-spacing-lg,1.5rem)}.main{padding:var(--snice-spacing-lg,2rem)}.grid{display:grid;grid-template-columns:repeat(3,1fr)}:host([columns=\"1\"]) .grid{grid-template-columns:1fr}:host([columns=\"2\"]) .grid{grid-template-columns:repeat(2,1fr)}:host([columns=\"3\"]) .grid{grid-template-columns:repeat(3,1fr)}:host([columns=\"4\"]) .grid{grid-template-columns:repeat(4,1fr)}:host([columns=\"6\"]) .grid{grid-template-columns:repeat(6,1fr)}:host([gap=sm]) .grid{gap:var(--snice-spacing-sm,.75rem)}:host(:not([gap])) .grid,:host([gap=md]) .grid{gap:var(--snice-spacing-md,1rem)}:host([gap=lg]) .grid{gap:var(--snice-spacing-lg,2rem)}:host([gap=xl]) .grid{gap:var(--snice-spacing-xl,3rem)}.footer{background:var(--snice-color-surface-container,hsl(0 0% 95%));border-top:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));padding:var(--snice-spacing-md,1rem) var(--snice-spacing-lg,1.5rem)}.footer--empty,.header--empty{display:none}@media (max-width:1200px){:host([columns=\"6\"]) .grid{grid-template-columns:repeat(4,1fr)}}@media (max-width:992px){:host([columns=\"4\"]) .grid,:host([columns=\"6\"]) .grid{grid-template-columns:repeat(3,1fr)}}@media (max-width:768px){:host(:not([columns])) .grid,:host([columns=\"3\"]) .grid,:host([columns=\"4\"]) .grid,:host([columns=\"6\"]) .grid{grid-template-columns:repeat(2,1fr)}}@media (max-width:480px){.grid{grid-template-columns:1fr!important}.main{padding:var(--snice-spacing-md,1rem)}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
1182
+
1183
+ (() => {
1184
+ let _classDecorators = [snice.element('snice-layout-card')];
1185
+ let _classDescriptor;
1186
+ let _classExtraInitializers = [];
1187
+ let _classThis;
1188
+ let _classSuper = HTMLElement;
1189
+ let _instanceExtraInitializers = [];
1190
+ let _columns_decorators;
1191
+ let _columns_initializers = [];
1192
+ let _columns_extraInitializers = [];
1193
+ let _gap_decorators;
1194
+ let _gap_initializers = [];
1195
+ let _gap_extraInitializers = [];
1196
+ let _hasFooter_decorators;
1197
+ let _hasFooter_initializers = [];
1198
+ let _hasFooter_extraInitializers = [];
1199
+ let _hasHeader_decorators;
1200
+ let _hasHeader_initializers = [];
1201
+ let _hasHeader_extraInitializers = [];
1202
+ let _render_decorators;
1203
+ let _wireSlotDetection_decorators;
1204
+ let _styles_decorators;
1205
+ (class extends _classSuper {
1206
+ static { _classThis = this; }
1207
+ static {
1208
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
1209
+ _columns_decorators = [snice.property({})];
1210
+ _gap_decorators = [snice.property({})];
1211
+ _hasFooter_decorators = [snice.property({ attribute: false })];
1212
+ _hasHeader_decorators = [snice.property({ attribute: false })];
1213
+ _render_decorators = [snice.render()];
1214
+ _wireSlotDetection_decorators = [snice.ready()];
1215
+ _styles_decorators = [snice.styles()];
1216
+ __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
1217
+ __esDecorate(this, null, _wireSlotDetection_decorators, { kind: "method", name: "wireSlotDetection", static: false, private: false, access: { has: obj => "wireSlotDetection" in obj, get: obj => obj.wireSlotDetection }, metadata: _metadata }, null, _instanceExtraInitializers);
1218
+ __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
1219
+ __esDecorate(null, null, _columns_decorators, { kind: "field", name: "columns", static: false, private: false, access: { has: obj => "columns" in obj, get: obj => obj.columns, set: (obj, value) => { obj.columns = value; } }, metadata: _metadata }, _columns_initializers, _columns_extraInitializers);
1220
+ __esDecorate(null, null, _gap_decorators, { kind: "field", name: "gap", static: false, private: false, access: { has: obj => "gap" in obj, get: obj => obj.gap, set: (obj, value) => { obj.gap = value; } }, metadata: _metadata }, _gap_initializers, _gap_extraInitializers);
1221
+ __esDecorate(null, null, _hasFooter_decorators, { kind: "field", name: "hasFooter", static: false, private: false, access: { has: obj => "hasFooter" in obj, get: obj => obj.hasFooter, set: (obj, value) => { obj.hasFooter = value; } }, metadata: _metadata }, _hasFooter_initializers, _hasFooter_extraInitializers);
1222
+ __esDecorate(null, null, _hasHeader_decorators, { kind: "field", name: "hasHeader", static: false, private: false, access: { has: obj => "hasHeader" in obj, get: obj => obj.hasHeader, set: (obj, value) => { obj.hasHeader = value; } }, metadata: _metadata }, _hasHeader_initializers, _hasHeader_extraInitializers);
1223
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
1224
+ _classThis = _classDescriptor.value;
1225
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
1226
+ __runInitializers(_classThis, _classExtraInitializers);
1227
+ }
1228
+ render() {
1229
+ return snice.html /*html*/ `
1230
+ <div class="layout">
1231
+ <header class="header${this.hasHeader ? '' : ' header--empty'}">
1232
+ <slot name="header"></slot>
1233
+ </header>
1234
+
1235
+ <main class="main">
1236
+ <div class="grid">
1237
+ <slot name="page"></slot>
1238
+ </div>
1239
+ </main>
1240
+
1241
+ <footer class="footer${this.hasFooter ? '' : ' footer--empty'}">
1242
+ <slot name="footer"></slot>
1243
+ </footer>
1244
+ </div>
1245
+ `;
1246
+ }
1247
+ wireSlotDetection() {
1248
+ this.syncSlotState();
1249
+ this.shadowRoot?.addEventListener('slotchange', () => this.syncSlotState());
1250
+ }
1251
+ syncSlotState() {
1252
+ this.hasFooter = !!this.querySelector('[slot="footer"]');
1253
+ this.hasHeader = !!this.querySelector('[slot="header"]');
1254
+ }
1255
+ styles() {
1256
+ return snice.css /*css*/ `${cssContent$a}`;
1257
+ }
1258
+ constructor() {
1259
+ super(...arguments);
1260
+ this.columns = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _columns_initializers, '3'));
1261
+ this.gap = (__runInitializers(this, _columns_extraInitializers), __runInitializers(this, _gap_initializers, 'md'));
1262
+ this.hasFooter = (__runInitializers(this, _gap_extraInitializers), __runInitializers(this, _hasFooter_initializers, false));
1263
+ this.hasHeader = (__runInitializers(this, _hasFooter_extraInitializers), __runInitializers(this, _hasHeader_initializers, false));
1264
+ __runInitializers(this, _hasHeader_extraInitializers);
1265
+ }
1266
+ });
1267
+ return _classThis;
1268
+ })();
1269
+
1270
+ var cssContent$9 = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);min-height:100vh;min-height:100dvh}:host([contained]){min-height:0}.layout{min-height:inherit;display:flex;align-items:center;justify-content:center;padding:var(--snice-spacing-xl,2rem);background:var(--snice-color-surface,rgb(255 255 255))}.stack{display:flex;flex-direction:column;align-items:center;gap:var(--snice-spacing-lg,1.5rem);width:100%}.brand{display:flex;justify-content:center;font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);font-size:var(--snice-heading-md, 1.125rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text,rgb(23 23 23))}.footer{display:flex;justify-content:center;gap:var(--snice-spacing-md,1rem);font-size:var(--snice-font-size-sm, .875rem);color:var(--snice-color-text-secondary,rgb(82 82 82))}.brand--empty,.footer--empty{display:none}.container{width:100%;max-width:24rem;background:var(--snice-color-surface-container-highest,hsl(0 0% 100%));border:1px solid var(--snice-color-border-subtle,transparent);border-radius:var(--snice-border-radius-lg,.5rem);box-shadow:var(--snice-shadow-lg,0 10px 15px -3px rgb(0 0 0 / .1),0 4px 6px -4px rgb(0 0 0 / .1));padding:var(--snice-spacing-xl,2rem)}:host([width=sm]) .container{max-width:20rem}:host([width=md]) .container{max-width:24rem}:host([width=lg]) .container{max-width:32rem}:host([width=xl]) .container{max-width:38rem}@media (max-width:480px){.layout{padding:var(--snice-spacing-md,1rem)}.container{padding:var(--snice-spacing-lg,1.5rem)}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
1271
+
1272
+ (() => {
1273
+ let _classDecorators = [snice.element('snice-layout-centered')];
1274
+ let _classDescriptor;
1275
+ let _classExtraInitializers = [];
1276
+ let _classThis;
1277
+ let _classSuper = HTMLElement;
1278
+ let _instanceExtraInitializers = [];
1279
+ let _width_decorators;
1280
+ let _width_initializers = [];
1281
+ let _width_extraInitializers = [];
1282
+ let _hasBrand_decorators;
1283
+ let _hasBrand_initializers = [];
1284
+ let _hasBrand_extraInitializers = [];
1285
+ let _hasFooter_decorators;
1286
+ let _hasFooter_initializers = [];
1287
+ let _hasFooter_extraInitializers = [];
1288
+ let _render_decorators;
1289
+ let _wireSlotDetection_decorators;
1290
+ let _styles_decorators;
1291
+ (class extends _classSuper {
1292
+ static { _classThis = this; }
1293
+ static {
1294
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
1295
+ _width_decorators = [snice.property({})];
1296
+ _hasBrand_decorators = [snice.property({ attribute: false })];
1297
+ _hasFooter_decorators = [snice.property({ attribute: false })];
1298
+ _render_decorators = [snice.render()];
1299
+ _wireSlotDetection_decorators = [snice.ready()];
1300
+ _styles_decorators = [snice.styles()];
1301
+ __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
1302
+ __esDecorate(this, null, _wireSlotDetection_decorators, { kind: "method", name: "wireSlotDetection", static: false, private: false, access: { has: obj => "wireSlotDetection" in obj, get: obj => obj.wireSlotDetection }, metadata: _metadata }, null, _instanceExtraInitializers);
1303
+ __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
1304
+ __esDecorate(null, null, _width_decorators, { kind: "field", name: "width", static: false, private: false, access: { has: obj => "width" in obj, get: obj => obj.width, set: (obj, value) => { obj.width = value; } }, metadata: _metadata }, _width_initializers, _width_extraInitializers);
1305
+ __esDecorate(null, null, _hasBrand_decorators, { kind: "field", name: "hasBrand", static: false, private: false, access: { has: obj => "hasBrand" in obj, get: obj => obj.hasBrand, set: (obj, value) => { obj.hasBrand = value; } }, metadata: _metadata }, _hasBrand_initializers, _hasBrand_extraInitializers);
1306
+ __esDecorate(null, null, _hasFooter_decorators, { kind: "field", name: "hasFooter", static: false, private: false, access: { has: obj => "hasFooter" in obj, get: obj => obj.hasFooter, set: (obj, value) => { obj.hasFooter = value; } }, metadata: _metadata }, _hasFooter_initializers, _hasFooter_extraInitializers);
1307
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
1308
+ _classThis = _classDescriptor.value;
1309
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
1310
+ __runInitializers(_classThis, _classExtraInitializers);
1311
+ }
1312
+ render() {
1313
+ return snice.html /*html*/ `
1314
+ <div class="layout">
1315
+ <div class="stack">
1316
+ <div class="brand${this.hasBrand ? '' : ' brand--empty'}">
1317
+ <slot name="brand"></slot>
1318
+ </div>
1319
+
1320
+ <div class="container">
1321
+ <slot name="page"></slot>
1322
+ </div>
1323
+
1324
+ <div class="footer${this.hasFooter ? '' : ' footer--empty'}">
1325
+ <slot name="footer"></slot>
1326
+ </div>
1327
+ </div>
1328
+ </div>
1329
+ `;
1330
+ }
1331
+ wireSlotDetection() {
1332
+ this.syncSlotState();
1333
+ this.shadowRoot?.addEventListener('slotchange', () => this.syncSlotState());
1334
+ }
1335
+ syncSlotState() {
1336
+ this.hasBrand = !!this.querySelector('[slot="brand"]');
1337
+ this.hasFooter = !!this.querySelector('[slot="footer"]');
1338
+ }
1339
+ styles() {
1340
+ return snice.css /*css*/ `${cssContent$9}`;
1341
+ }
1342
+ constructor() {
1343
+ super(...arguments);
1344
+ this.width = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _width_initializers, 'md'));
1345
+ this.hasBrand = (__runInitializers(this, _width_extraInitializers), __runInitializers(this, _hasBrand_initializers, false));
1346
+ this.hasFooter = (__runInitializers(this, _hasBrand_extraInitializers), __runInitializers(this, _hasFooter_initializers, false));
1347
+ __runInitializers(this, _hasFooter_extraInitializers);
1348
+ }
1349
+ });
1350
+ return _classThis;
1351
+ })();
1352
+
1353
+ var cssContent$8 = ":host{display:block;--breadcrumb-font-size:0.875rem;--breadcrumb-spacing:0.5rem;--breadcrumb-color:var(--snice-color-text-secondary, rgb(82 82 82));--breadcrumb-hover-color:var(--snice-color-primary, rgb(37 99 235));--breadcrumb-active-color:var(--snice-color-text, rgb(23 23 23));--breadcrumb-separator-color:var(--snice-color-text-tertiary, rgb(163 163 163))}case,default,if,when{display:contents}.breadcrumb{display:flex;align-items:center;flex-wrap:wrap;list-style:none;margin:0;padding:0;font-size:var(--breadcrumb-font-size);line-height:1.5}.breadcrumb-item{display:flex;align-items:center;color:var(--breadcrumb-color)}.breadcrumb-link{color:inherit;text-decoration:none;transition:color .2s;cursor:pointer;outline:0;border-radius:var(--snice-border-radius-sm,.125rem);padding:.125rem .25rem;margin:-.125rem -.25rem;display:inline-flex;align-items:center;gap:.375rem}.breadcrumb-link:hover{color:var(--breadcrumb-hover-color);text-decoration:underline}.breadcrumb-link:focus-visible{box-shadow:0 0 0 2px var(--snice-focus-ring-color,rgb(59 130 246 / .5))}.breadcrumb-text{padding:2px 4px;margin:-2px -4px;display:inline-flex;align-items:center;gap:.375rem}.breadcrumb-icon{display:inline-flex;align-items:center;justify-content:center;font-size:1.1em;width:1.2em;height:1.2em;line-height:1}.breadcrumb-icon svg{width:1.2em;height:1.2em}.breadcrumb-icon img{width:1.2em;height:1.2em;object-fit:contain}.breadcrumb-icon-image{width:1.2em;height:1.2em;object-fit:contain;vertical-align:middle}[hidden]{display:none!important}.breadcrumb-item--active{color:var(--breadcrumb-active-color);font-weight:var(--snice-font-weight-medium,500)}.breadcrumb-item--active .breadcrumb-link{cursor:default;pointer-events:none}.breadcrumb-separator{margin:0 var(--breadcrumb-spacing);color:var(--breadcrumb-separator-color);user-select:none}.breadcrumb-ellipsis{display:flex;align-items:center;padding:2px 4px;margin:-2px -4px;cursor:pointer;color:var(--breadcrumb-color);background:0 0;border:none;font:inherit;border-radius:var(--snice-border-radius-sm,.125rem);transition:background .2s}.breadcrumb-ellipsis:hover{background:var(--snice-color-surface-hover,rgb(0 0 0 / .05))}.breadcrumb-ellipsis:focus-visible{box-shadow:0 0 0 2px var(--snice-focus-ring-color,rgb(59 130 246 / .5));outline:0}:host([size=small]){--breadcrumb-font-size:0.75rem;--breadcrumb-spacing:0.375rem}:host([size=large]){--breadcrumb-font-size:1rem;--breadcrumb-spacing:0.625rem}.breadcrumb--collapsed .breadcrumb-item--hidden{display:none}@media (max-width:640px){.breadcrumb{font-size:calc(var(--breadcrumb-font-size) * .9)}}.breadcrumb-ellipsis-icon{display:flex}.breadcrumb-ellipsis-icon svg{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
1354
+
1355
+ (() => {
1356
+ let _classDecorators = [snice.element('snice-breadcrumbs')];
1357
+ let _classDescriptor;
1358
+ let _classExtraInitializers = [];
1359
+ let _classThis;
1360
+ let _classSuper = HTMLElement;
1361
+ let _instanceExtraInitializers = [];
1362
+ let _items_decorators;
1363
+ let _items_initializers = [];
1364
+ let _items_extraInitializers = [];
1365
+ let _separator_decorators;
1366
+ let _separator_initializers = [];
1367
+ let _separator_extraInitializers = [];
1368
+ let _size_decorators;
1369
+ let _size_initializers = [];
1370
+ let _size_extraInitializers = [];
1371
+ let _maxItems_decorators;
1372
+ let _maxItems_initializers = [];
1373
+ let _maxItems_extraInitializers = [];
1374
+ let _breadcrumbElement_decorators;
1375
+ let _breadcrumbElement_initializers = [];
1376
+ let _breadcrumbElement_extraInitializers = [];
1377
+ let _collapsed_decorators;
1378
+ let _collapsed_initializers = [];
1379
+ let _collapsed_extraInitializers = [];
1380
+ let _renderTrigger_decorators;
1381
+ let _renderTrigger_initializers = [];
1382
+ let _renderTrigger_extraInitializers = [];
1383
+ let _render_decorators;
1384
+ let _styles_decorators;
1385
+ let _emitBreadcrumbClick_decorators;
1386
+ let _updateBreadcrumb_decorators;
1387
+ (class extends _classSuper {
1388
+ static { _classThis = this; }
1389
+ static {
1390
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
1391
+ _items_decorators = [snice.property({ type: Array, attribute: false })];
1392
+ _separator_decorators = [snice.property({})];
1393
+ _size_decorators = [snice.property({})];
1394
+ _maxItems_decorators = [snice.property({ type: Number, attribute: 'max-items' })];
1395
+ _breadcrumbElement_decorators = [snice.query('.breadcrumb')];
1396
+ _collapsed_decorators = [snice.property({ type: Boolean })];
1397
+ _renderTrigger_decorators = [snice.property({ type: Number, attribute: false })];
1398
+ _render_decorators = [snice.render()];
1399
+ _styles_decorators = [snice.styles()];
1400
+ _emitBreadcrumbClick_decorators = [snice.dispatch('breadcrumb-click', { bubbles: true, composed: true })];
1401
+ _updateBreadcrumb_decorators = [snice.watch('items', 'separator', 'maxItems')];
1402
+ __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
1403
+ __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
1404
+ __esDecorate(this, null, _emitBreadcrumbClick_decorators, { kind: "method", name: "emitBreadcrumbClick", static: false, private: false, access: { has: obj => "emitBreadcrumbClick" in obj, get: obj => obj.emitBreadcrumbClick }, metadata: _metadata }, null, _instanceExtraInitializers);
1405
+ __esDecorate(this, null, _updateBreadcrumb_decorators, { kind: "method", name: "updateBreadcrumb", static: false, private: false, access: { has: obj => "updateBreadcrumb" in obj, get: obj => obj.updateBreadcrumb }, metadata: _metadata }, null, _instanceExtraInitializers);
1406
+ __esDecorate(null, null, _items_decorators, { kind: "field", name: "items", static: false, private: false, access: { has: obj => "items" in obj, get: obj => obj.items, set: (obj, value) => { obj.items = value; } }, metadata: _metadata }, _items_initializers, _items_extraInitializers);
1407
+ __esDecorate(null, null, _separator_decorators, { kind: "field", name: "separator", static: false, private: false, access: { has: obj => "separator" in obj, get: obj => obj.separator, set: (obj, value) => { obj.separator = value; } }, metadata: _metadata }, _separator_initializers, _separator_extraInitializers);
1408
+ __esDecorate(null, null, _size_decorators, { kind: "field", name: "size", static: false, private: false, access: { has: obj => "size" in obj, get: obj => obj.size, set: (obj, value) => { obj.size = value; } }, metadata: _metadata }, _size_initializers, _size_extraInitializers);
1409
+ __esDecorate(null, null, _maxItems_decorators, { kind: "field", name: "maxItems", static: false, private: false, access: { has: obj => "maxItems" in obj, get: obj => obj.maxItems, set: (obj, value) => { obj.maxItems = value; } }, metadata: _metadata }, _maxItems_initializers, _maxItems_extraInitializers);
1410
+ __esDecorate(null, null, _breadcrumbElement_decorators, { kind: "field", name: "breadcrumbElement", static: false, private: false, access: { has: obj => "breadcrumbElement" in obj, get: obj => obj.breadcrumbElement, set: (obj, value) => { obj.breadcrumbElement = value; } }, metadata: _metadata }, _breadcrumbElement_initializers, _breadcrumbElement_extraInitializers);
1411
+ __esDecorate(null, null, _collapsed_decorators, { kind: "field", name: "collapsed", static: false, private: false, access: { has: obj => "collapsed" in obj, get: obj => obj.collapsed, set: (obj, value) => { obj.collapsed = value; } }, metadata: _metadata }, _collapsed_initializers, _collapsed_extraInitializers);
1412
+ __esDecorate(null, null, _renderTrigger_decorators, { kind: "field", name: "renderTrigger", static: false, private: false, access: { has: obj => "renderTrigger" in obj, get: obj => obj.renderTrigger, set: (obj, value) => { obj.renderTrigger = value; } }, metadata: _metadata }, _renderTrigger_initializers, _renderTrigger_extraInitializers);
1413
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
1414
+ _classThis = _classDescriptor.value;
1415
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
1416
+ __runInitializers(_classThis, _classExtraInitializers);
1417
+ }
1418
+ render() {
1419
+ const allItems = this.getAllItems();
1420
+ const visibleItems = this.getVisibleItems(allItems);
1421
+ const hasCollapsed = this.maxItems > 0 && allItems.length > this.maxItems && this.collapsed;
1422
+ const breadcrumbClass = `breadcrumb${hasCollapsed ? ' breadcrumb--collapsed' : ''}`;
1423
+ return snice.html /*html*/ `
1424
+ <slot style="display: none" @slotchange="${() => this.handleSlotChange()}"></slot>
1425
+ <nav part="base" aria-label="Breadcrumb" @click="${(e) => this.handleClick(e)}">
1426
+ <ol part="list" class="${breadcrumbClass}">
1427
+ ${visibleItems.map((item, index) => {
1428
+ const isLast = index === visibleItems.length - 1;
1429
+ const isActive = item.active || isLast;
1430
+ const isHidden = hasCollapsed && index > 0 && index < visibleItems.length - 2;
1431
+ const itemClass = `breadcrumb-item${isActive ? ' breadcrumb-item--active' : ''}${isHidden ? ' breadcrumb-item--hidden' : ''}`;
1432
+ const allIndex = allItems.indexOf(item);
1433
+ const showLink = !!item.href && !isActive;
1434
+ const showActiveText = !showLink && isActive;
1435
+ const showInactiveText = !showLink && !isActive;
1436
+ return snice.html /*html*/ `
1437
+ <li class="${itemClass}">
1438
+ <if ${showLink}>
1439
+ <a part="link" href="${item.href}"
1440
+ class="breadcrumb-link"
1441
+ data-index="${allIndex}"
1442
+ tabindex="0">
1443
+ ${this.renderItemIcon(item)}
1444
+ ${item.label}
1445
+ </a>
1446
+ </if>
1447
+ <if ${showActiveText}>
1448
+ <span class="breadcrumb-text" aria-current="page">
1449
+ ${this.renderItemIcon(item)}
1450
+ ${item.label}
1451
+ </span>
1452
+ </if>
1453
+ <if ${showInactiveText}>
1454
+ <span class="breadcrumb-text">
1455
+ ${this.renderItemIcon(item)}
1456
+ ${item.label}
1457
+ </span>
1458
+ </if>
1459
+ <if ${!isLast}>
1460
+ <span part="separator" class="breadcrumb-separator" aria-hidden="true">
1461
+ ${this.separator}
1462
+ </span>
1463
+ </if>
1464
+ </li>
1465
+ <if ${hasCollapsed && index === 0 && allItems.length > this.maxItems}>
1466
+ <li class="breadcrumb-item">
1467
+ <button part="ellipsis" class="breadcrumb-ellipsis"
1468
+ aria-label="Show all breadcrumbs"
1469
+ aria-expanded="false"
1470
+ tabindex="0">
1471
+ <span class="breadcrumb-ellipsis-icon" aria-hidden="true">${snice.unsafeHTML(ELLIPSIS_HORIZONTAL)}</span>
1472
+ </button>
1473
+ <span class="breadcrumb-separator" aria-hidden="true">
1474
+ ${this.separator}
1475
+ </span>
1476
+ </li>
1477
+ </if>
1478
+ `;
1479
+ })}
1480
+ </ol>
1481
+ </nav>
1482
+ `;
1483
+ }
1484
+ styles() {
1485
+ return snice.css `${cssContent$8}`;
1486
+ }
1487
+ getAllItems() {
1488
+ // Prefer slot items if available, otherwise use items property
1489
+ return this.slotItems.length > 0 ? this.slotItems : this.items;
1490
+ }
1491
+ getVisibleItems(allItems) {
1492
+ if (this.maxItems <= 0 || allItems.length <= this.maxItems || !this.collapsed) {
1493
+ return allItems;
1494
+ }
1495
+ // Show first item and last (maxItems - 1) items
1496
+ const firstItem = allItems[0];
1497
+ const lastItems = allItems.slice(-(this.maxItems - 1));
1498
+ return [firstItem, ...lastItems];
1499
+ }
1500
+ handleClick(event) {
1501
+ const target = event.target;
1502
+ // Handle ellipsis click
1503
+ if (target.closest('.breadcrumb-ellipsis')) {
1504
+ this.collapsed = false;
1505
+ // The ellipsis button disappears on expand; move focus to the first
1506
+ // newly revealed crumb so keyboard users aren't dropped to the body.
1507
+ this.rendered?.then?.(() => {
1508
+ const firstRevealed = this.shadowRoot?.querySelectorAll('.breadcrumb-link')[1];
1509
+ (firstRevealed ?? this.shadowRoot?.querySelector('.breadcrumb-link'))?.focus();
1510
+ });
1511
+ return;
1512
+ }
1513
+ // Handle breadcrumb link click
1514
+ const link = target.closest('.breadcrumb-link');
1515
+ if (link) {
1516
+ const href = link.getAttribute('href') || '';
1517
+ const idxAttr = link.getAttribute('data-index');
1518
+ const allItems = this.getAllItems();
1519
+ const index = idxAttr !== null ? parseInt(idxAttr, 10) : -1;
1520
+ const item = index >= 0 && index < allItems.length ? allItems[index] : undefined;
1521
+ const label = item?.label ?? link.textContent?.trim() ?? '';
1522
+ this.emitBreadcrumbClick({ item, index, href, label });
1523
+ }
1524
+ }
1525
+ emitBreadcrumbClick(detail) {
1526
+ return detail;
1527
+ }
1528
+ handleSlotChange() {
1529
+ const slot = this.shadowRoot?.querySelector('slot');
1530
+ if (!slot)
1531
+ return;
1532
+ const crumbs = slot.assignedElements().filter(el => el.tagName.toLowerCase() === 'snice-crumb');
1533
+ this.slotItems = crumbs.map(crumb => {
1534
+ // Check for slotted icon element
1535
+ const iconElement = crumb.querySelector('[slot="icon"]');
1536
+ return {
1537
+ label: crumb.label || crumb.textContent?.trim() || '',
1538
+ href: crumb.href || undefined,
1539
+ icon: crumb.icon || undefined,
1540
+ iconImage: crumb.iconImage || undefined,
1541
+ active: crumb.active || false,
1542
+ iconNode: iconElement || undefined
1543
+ };
1544
+ });
1545
+ // Trigger re-render to display slot items by updating a property
1546
+ this.renderTrigger++;
1547
+ }
1548
+ updateBreadcrumb() {
1549
+ this.collapsed = true;
1550
+ }
1551
+ setItems(items) {
1552
+ this.items = items;
1553
+ }
1554
+ renderItemIcon(item) {
1555
+ // Slotted icon node takes precedence
1556
+ if (item.iconNode) {
1557
+ const clone = item.iconNode.cloneNode(true);
1558
+ clone.classList.add('breadcrumb-icon');
1559
+ clone.removeAttribute('slot');
1560
+ return snice.html `${clone}`;
1561
+ }
1562
+ // iconImage takes precedence for backwards compatibility
1563
+ if (item.iconImage) {
1564
+ return renderIcon(item.iconImage, 'breadcrumb-icon');
1565
+ }
1566
+ if (item.icon) {
1567
+ return renderIcon(item.icon, 'breadcrumb-icon');
1568
+ }
1569
+ return snice.html ``;
1570
+ }
1571
+ constructor() {
1572
+ super(...arguments);
1573
+ this.items = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _items_initializers, []));
1574
+ this.separator = (__runInitializers(this, _items_extraInitializers), __runInitializers(this, _separator_initializers, '/'));
1575
+ this.size = (__runInitializers(this, _separator_extraInitializers), __runInitializers(this, _size_initializers, 'medium'));
1576
+ this.maxItems = (__runInitializers(this, _size_extraInitializers), __runInitializers(this, _maxItems_initializers, 0));
1577
+ this.breadcrumbElement = (__runInitializers(this, _maxItems_extraInitializers), __runInitializers(this, _breadcrumbElement_initializers, void 0));
1578
+ this.collapsed = (__runInitializers(this, _breadcrumbElement_extraInitializers), __runInitializers(this, _collapsed_initializers, true));
1579
+ this.slotItems = (__runInitializers(this, _collapsed_extraInitializers), []);
1580
+ this.renderTrigger = __runInitializers(this, _renderTrigger_initializers, 0);
1581
+ __runInitializers(this, _renderTrigger_extraInitializers);
1582
+ }
1583
+ });
1584
+ return _classThis;
1585
+ })();
1586
+
1587
+ var cssContent$7 = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif)}:host(:not([contained])){position:fixed;inset:0}:host([contained]){position:relative;min-height:0;height:100%}.layout{display:flex;flex-direction:column;min-height:100%;background:var(--snice-color-surface,rgb(255 255 255))}.header{display:flex;align-items:center;gap:var(--snice-spacing-md,1rem);padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-lg,1.5rem);background:var(--snice-color-surface-container-high,rgb(252 251 249));border-bottom:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));position:relative;z-index:var(--snice-z-sticky,10)}.header-start h1{font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);margin:0;font-size:var(--snice-heading-md, 1.125rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text,rgb(23 23 23));white-space:nowrap}.header-content{flex:1;min-width:0;display:flex;align-items:center;justify-content:flex-end;gap:var(--snice-spacing-md,1rem)}.sidebar-toggle{display:flex;align-items:center;justify-content:center;width:var(--snice-layout-control-size,2rem);height:var(--snice-layout-control-size,2rem);background:0 0;border:none;color:var(--snice-color-text-secondary,rgb(82 82 82));cursor:pointer;padding:var(--snice-spacing-xs,.5rem);border-radius:var(--snice-border-radius-md,6px);transition:all var(--snice-transition-fast, 150ms) ease}.sidebar-toggle:hover{background:var(--snice-color-surface-hover,var(--snice-color-overlay-hover,hsl(0 0% 0% / .04)));color:var(--snice-color-text,rgb(23 23 23))}.sidebar-toggle:focus-visible{outline:var(--snice-focus-ring-width,2px) solid var(--snice-focus-ring-color,rgb(59 130 246 / .5));outline-offset:var(--snice-focus-ring-offset,2px)}.toolbar{padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-lg,1.5rem);border-bottom:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));background:var(--snice-color-surface,rgb(255 255 255))}.toolbar--hidden{display:none}.body-area{position:relative;display:flex;flex:1;overflow:hidden}.sidebar{flex-shrink:0;width:var(--snice-layout-sidebar-width,16rem);background:var(--snice-color-surface-container-low,rgb(250 250 250));border-right:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));overflow-y:auto;overflow-x:hidden;padding-block:var(--snice-spacing-sm,0.75rem);transition:width var(--snice-transition-normal, 250ms) ease,transform var(--snice-transition-normal, 250ms) ease}.sidebar--collapsed{width:0;border-right:none}.scrim{display:none}.sidebar ::slotted(a),.sidebar ::slotted(button){display:flex;align-items:center;gap:var(--snice-spacing-sm,.75rem);padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-md,1rem);margin:0 var(--snice-spacing-xs,.5rem);border-radius:var(--snice-border-radius-md,6px);color:var(--snice-color-text-secondary,rgb(82 82 82));text-decoration:none;cursor:pointer;transition:background var(--snice-transition-fast, 150ms) ease,color var(--snice-transition-fast, 150ms) ease}.sidebar ::slotted(a:hover),.sidebar ::slotted(button:hover){background:var(--snice-color-surface-hover,var(--snice-color-overlay-hover,hsl(0 0% 0% / .06)));color:var(--snice-color-text,rgb(23 23 23))}.sidebar ::slotted(a:focus-visible),.sidebar ::slotted(button:focus-visible){outline:var(--snice-focus-ring-width,2px) solid var(--snice-focus-ring-color,rgb(59 130 246 / .5));outline-offset:var(--snice-focus-ring-offset,2px)}.sidebar ::slotted([aria-current]){background:var(--snice-color-primary-alpha,color-mix(in srgb,var(--snice-color-primary,rgb(37 99 235)) 10%,transparent));color:var(--snice-color-primary,rgb(37 99 235))}.sidebar-nav{display:flex;flex-direction:column;gap:var(--snice-spacing-sm,.75rem);padding:var(--snice-spacing-md,1rem)}.content-area{flex:1;min-width:0;display:grid;grid-template-columns:1fr;grid-template-areas:\"main\";overflow-y:auto}.content-area--railed{grid-template-columns:1fr var(--snice-layout-rail-width,18rem);grid-template-areas:\"main right-sidebar\"}.main{grid-area:main;padding:var(--snice-spacing-xl,2rem);min-width:0}.right-sidebar{grid-area:right-sidebar;background:var(--snice-color-surface-container-low,rgb(250 250 250));padding:var(--snice-spacing-lg,1.5rem);border-left:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)))}.right-sidebar--empty{display:none}@media (max-width:1024px){.content-area--railed{grid-template-columns:1fr;grid-template-areas:\"main\" \"right-sidebar\"}.right-sidebar{border-left:none;border-top:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)))}}@media (max-width:768px){.header,.toolbar{padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-md,1rem)}.sidebar{position:absolute;top:0;bottom:0;left:0;z-index:var(--snice-z-overlay,1100);width:min(80vw,18rem);transform:translateX(-105%);box-shadow:var(--snice-shadow-lg,0 10px 15px -3px rgb(0 0 0 / .1),0 4px 6px -4px rgb(0 0 0 / .1))}.sidebar--collapsed{width:min(80vw,18rem);border-right:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)))}.sidebar--mobile-open{transform:translateX(0)}.scrim--visible{display:block;position:absolute;inset:0;z-index:var(--snice-z-scrim,1000);background:rgb(0 0 0 / .4)}.main{padding:var(--snice-spacing-md,1rem)}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
937
1588
 
938
- return exports;
1589
+ (() => {
1590
+ let _classDecorators = [snice.element('snice-layout-dashboard')];
1591
+ let _classDescriptor;
1592
+ let _classExtraInitializers = [];
1593
+ let _classThis;
1594
+ let _classSuper = HTMLElement;
1595
+ let _instanceExtraInitializers = [];
1596
+ let _navElement_decorators;
1597
+ let _navElement_initializers = [];
1598
+ let _navElement_extraInitializers = [];
1599
+ let _placards_decorators;
1600
+ let _placards_initializers = [];
1601
+ let _placards_extraInitializers = [];
1602
+ let _currentRoute_decorators;
1603
+ let _currentRoute_initializers = [];
1604
+ let _currentRoute_extraInitializers = [];
1605
+ let _collapsed_decorators;
1606
+ let _collapsed_initializers = [];
1607
+ let _collapsed_extraInitializers = [];
1608
+ let _contained_decorators;
1609
+ let _contained_initializers = [];
1610
+ let _contained_extraInitializers = [];
1611
+ let _mobileOpen_decorators;
1612
+ let _mobileOpen_initializers = [];
1613
+ let _mobileOpen_extraInitializers = [];
1614
+ let _hasRail_decorators;
1615
+ let _hasRail_initializers = [];
1616
+ let _hasRail_extraInitializers = [];
1617
+ let _hasToolbarContent_decorators;
1618
+ let _hasToolbarContent_initializers = [];
1619
+ let _hasToolbarContent_extraInitializers = [];
1620
+ let _render_decorators;
1621
+ let _wireSlotDetection_decorators;
1622
+ let _styles_decorators;
1623
+ (class extends _classSuper {
1624
+ static { _classThis = this; }
1625
+ static {
1626
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
1627
+ _navElement_decorators = [snice.query('snice-nav')];
1628
+ _placards_decorators = [snice.property({ type: Array })];
1629
+ _currentRoute_decorators = [snice.property({ attribute: false })];
1630
+ _collapsed_decorators = [snice.property({ type: Boolean })];
1631
+ _contained_decorators = [snice.property({ type: Boolean })];
1632
+ _mobileOpen_decorators = [snice.property({ attribute: false })];
1633
+ _hasRail_decorators = [snice.property({ attribute: false })];
1634
+ _hasToolbarContent_decorators = [snice.property({ attribute: false })];
1635
+ _render_decorators = [snice.render()];
1636
+ _wireSlotDetection_decorators = [snice.ready()];
1637
+ _styles_decorators = [snice.styles()];
1638
+ __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
1639
+ __esDecorate(this, null, _wireSlotDetection_decorators, { kind: "method", name: "wireSlotDetection", static: false, private: false, access: { has: obj => "wireSlotDetection" in obj, get: obj => obj.wireSlotDetection }, metadata: _metadata }, null, _instanceExtraInitializers);
1640
+ __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
1641
+ __esDecorate(null, null, _navElement_decorators, { kind: "field", name: "navElement", static: false, private: false, access: { has: obj => "navElement" in obj, get: obj => obj.navElement, set: (obj, value) => { obj.navElement = value; } }, metadata: _metadata }, _navElement_initializers, _navElement_extraInitializers);
1642
+ __esDecorate(null, null, _placards_decorators, { kind: "field", name: "placards", static: false, private: false, access: { has: obj => "placards" in obj, get: obj => obj.placards, set: (obj, value) => { obj.placards = value; } }, metadata: _metadata }, _placards_initializers, _placards_extraInitializers);
1643
+ __esDecorate(null, null, _currentRoute_decorators, { kind: "field", name: "currentRoute", static: false, private: false, access: { has: obj => "currentRoute" in obj, get: obj => obj.currentRoute, set: (obj, value) => { obj.currentRoute = value; } }, metadata: _metadata }, _currentRoute_initializers, _currentRoute_extraInitializers);
1644
+ __esDecorate(null, null, _collapsed_decorators, { kind: "field", name: "collapsed", static: false, private: false, access: { has: obj => "collapsed" in obj, get: obj => obj.collapsed, set: (obj, value) => { obj.collapsed = value; } }, metadata: _metadata }, _collapsed_initializers, _collapsed_extraInitializers);
1645
+ __esDecorate(null, null, _contained_decorators, { kind: "field", name: "contained", static: false, private: false, access: { has: obj => "contained" in obj, get: obj => obj.contained, set: (obj, value) => { obj.contained = value; } }, metadata: _metadata }, _contained_initializers, _contained_extraInitializers);
1646
+ __esDecorate(null, null, _mobileOpen_decorators, { kind: "field", name: "mobileOpen", static: false, private: false, access: { has: obj => "mobileOpen" in obj, get: obj => obj.mobileOpen, set: (obj, value) => { obj.mobileOpen = value; } }, metadata: _metadata }, _mobileOpen_initializers, _mobileOpen_extraInitializers);
1647
+ __esDecorate(null, null, _hasRail_decorators, { kind: "field", name: "hasRail", static: false, private: false, access: { has: obj => "hasRail" in obj, get: obj => obj.hasRail, set: (obj, value) => { obj.hasRail = value; } }, metadata: _metadata }, _hasRail_initializers, _hasRail_extraInitializers);
1648
+ __esDecorate(null, null, _hasToolbarContent_decorators, { kind: "field", name: "hasToolbarContent", static: false, private: false, access: { has: obj => "hasToolbarContent" in obj, get: obj => obj.hasToolbarContent, set: (obj, value) => { obj.hasToolbarContent = value; } }, metadata: _metadata }, _hasToolbarContent_initializers, _hasToolbarContent_extraInitializers);
1649
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
1650
+ _classThis = _classDescriptor.value;
1651
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
1652
+ __runInitializers(_classThis, _classExtraInitializers);
1653
+ }
1654
+ render() {
1655
+ const sidebarCollapsedClass = this.collapsed ? ' sidebar--collapsed' : '';
1656
+ const sidebarMobileClass = this.mobileOpen ? ' sidebar--mobile-open' : '';
1657
+ const scrimClass = this.mobileOpen ? ' scrim--visible' : '';
1658
+ const expanded = this.mobileOpen || !this.collapsed;
1659
+ const railedClass = this.hasRail ? ' content-area--railed' : '';
1660
+ const railEmptyClass = this.hasRail ? '' : ' right-sidebar--empty';
1661
+ const breadcrumbsHtml = this.getBreadcrumbsHtml();
1662
+ const toolbarHiddenClass = this.hasToolbarContent || breadcrumbsHtml ? '' : ' toolbar--hidden';
1663
+ return snice.html /*html*/ `
1664
+ <div class="layout">
1665
+ <header class="header" part="header">
1666
+ <button class="sidebar-toggle" type="button" aria-label="Toggle sidebar" aria-expanded="${expanded}" @click=${this.handleSidebarToggle}>
1667
+ <svg viewBox="0 0 24 24" width="20" height="20">
1668
+ <path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z" fill="currentColor"/>
1669
+ </svg>
1670
+ </button>
1671
+ <div class="header-start">
1672
+ <slot name="brand">
1673
+ <h1>Dashboard</h1>
1674
+ </slot>
1675
+ </div>
1676
+ <div class="header-content">
1677
+ <slot name="header"></slot>
1678
+ </div>
1679
+ </header>
1680
+
1681
+ <div class="toolbar${toolbarHiddenClass}" part="toolbar">
1682
+ <slot name="toolbar">${breadcrumbsHtml}</slot>
1683
+ </div>
1684
+
1685
+ <div class="body-area">
1686
+ <aside class="sidebar${sidebarCollapsedClass}${sidebarMobileClass}" part="sidebar">
1687
+ <slot name="sidebar">
1688
+ <snice-nav class="sidebar-nav" variant="hierarchical" orientation="vertical"></snice-nav>
1689
+ </slot>
1690
+ </aside>
1691
+
1692
+ <div class="scrim${scrimClass}" part="scrim" @click=${this.handleScrimClick}></div>
1693
+
1694
+ <div class="content-area${railedClass}">
1695
+ <main class="main" part="main">
1696
+ <slot name="page"></slot>
1697
+ </main>
1698
+
1699
+ <aside class="right-sidebar${railEmptyClass}" part="right-sidebar">
1700
+ <slot name="right-sidebar"></slot>
1701
+ </aside>
1702
+ </div>
1703
+ </div>
1704
+ </div>
1705
+ `;
1706
+ }
1707
+ handleSidebarToggle() {
1708
+ const isMobileViewport = typeof window !== 'undefined'
1709
+ && typeof window.matchMedia === 'function'
1710
+ && window.matchMedia('(max-width: 768px)').matches;
1711
+ if (isMobileViewport) {
1712
+ this.mobileOpen = !this.mobileOpen;
1713
+ return;
1714
+ }
1715
+ this.collapsed = !this.collapsed;
1716
+ }
1717
+ handleScrimClick() {
1718
+ this.mobileOpen = false;
1719
+ }
1720
+ wireSlotDetection() {
1721
+ this.syncSlotState();
1722
+ // slotchange bubbles to the shadow root (not past it), so one delegated
1723
+ // listener survives re-renders that replace the slot elements.
1724
+ this.shadowRoot?.addEventListener('slotchange', () => this.syncSlotState());
1725
+ }
1726
+ syncSlotState() {
1727
+ this.hasRail = !!this.querySelector('[slot="right-sidebar"]');
1728
+ this.hasToolbarContent = !!this.querySelector('[slot="toolbar"]');
1729
+ }
1730
+ styles() {
1731
+ return snice.css /*css*/ `${cssContent$7}`;
1732
+ }
1733
+ update(appContext, placards, currentRoute, routeParams) {
1734
+ this.placards = placards;
1735
+ this.currentRoute = currentRoute;
1736
+ // Update navigation
1737
+ this.updateNav(appContext, routeParams);
1738
+ }
1739
+ updateNav(appContext, routeParams) {
1740
+ if (this.navElement) {
1741
+ this.navElement.update(this.placards, appContext, this.currentRoute, routeParams);
1742
+ }
1743
+ }
1744
+ getBreadcrumbsHtml() {
1745
+ const currentPlacard = this.placards.find(p => this.currentRoute === p.name || this.currentRoute.startsWith(`/${p.name}`));
1746
+ if (!currentPlacard) {
1747
+ return '';
1748
+ }
1749
+ // Build breadcrumb trail
1750
+ const breadcrumbs = this.buildBreadcrumbTrail(currentPlacard);
1751
+ if (breadcrumbs.length === 0) {
1752
+ return '';
1753
+ }
1754
+ return `
1755
+ <snice-breadcrumbs
1756
+ items='${JSON.stringify(breadcrumbs.map(p => ({
1757
+ label: p.title,
1758
+ href: p.href || '',
1759
+ icon: p.icon
1760
+ })))}'
1761
+ separator="/">
1762
+ </snice-breadcrumbs>
1763
+ `;
1764
+ }
1765
+ buildBreadcrumbTrail(placard) {
1766
+ const trail = [];
1767
+ // If explicit breadcrumbs are defined, use them
1768
+ if (placard.breadcrumbs && placard.breadcrumbs.length > 0) {
1769
+ placard.breadcrumbs.forEach(name => {
1770
+ const p = this.placards.find(pc => pc.name === name);
1771
+ if (p)
1772
+ trail.push(p);
1773
+ });
1774
+ return trail;
1775
+ }
1776
+ // Otherwise, build from parent hierarchy
1777
+ let current = placard;
1778
+ const visited = new Set();
1779
+ while (current) {
1780
+ if (visited.has(current.name))
1781
+ break; // Prevent infinite loops
1782
+ visited.add(current.name);
1783
+ trail.unshift(current);
1784
+ if (current.parent) {
1785
+ current = this.placards.find(p => p.name === current.parent);
1786
+ }
1787
+ else {
1788
+ break;
1789
+ }
1790
+ }
1791
+ return trail;
1792
+ }
1793
+ constructor() {
1794
+ super(...arguments);
1795
+ this.navElement = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _navElement_initializers, void 0));
1796
+ this.placards = (__runInitializers(this, _navElement_extraInitializers), __runInitializers(this, _placards_initializers, []));
1797
+ this.currentRoute = (__runInitializers(this, _placards_extraInitializers), __runInitializers(this, _currentRoute_initializers, ''));
1798
+ this.collapsed = (__runInitializers(this, _currentRoute_extraInitializers), __runInitializers(this, _collapsed_initializers, false));
1799
+ /** Size to the parent element instead of pinning to the viewport. */
1800
+ this.contained = (__runInitializers(this, _collapsed_extraInitializers), __runInitializers(this, _contained_initializers, false));
1801
+ this.mobileOpen = (__runInitializers(this, _contained_extraInitializers), __runInitializers(this, _mobileOpen_initializers, false));
1802
+ this.hasRail = (__runInitializers(this, _mobileOpen_extraInitializers), __runInitializers(this, _hasRail_initializers, false));
1803
+ this.hasToolbarContent = (__runInitializers(this, _hasRail_extraInitializers), __runInitializers(this, _hasToolbarContent_initializers, false));
1804
+ __runInitializers(this, _hasToolbarContent_extraInitializers);
1805
+ }
1806
+ });
1807
+ return _classThis;
1808
+ })();
1809
+
1810
+ var cssContent$6 = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif)}:host(:not([contained])){position:fixed;inset:0}:host([contained]){position:relative;min-height:0;height:100%}.layout{min-height:inherit;display:grid;grid-template-rows:auto 1fr;height:100%;background:var(--snice-color-surface,rgb(255 255 255))}.skip-link{position:absolute;top:var(--snice-spacing-xs,.5rem);left:var(--snice-spacing-xs,.5rem);z-index:var(--snice-z-notification,1300);padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-md,1rem);border-radius:var(--snice-border-radius-md,6px);background:var(--snice-color-surface-container-highest,hsl(0 0% 100%));color:var(--snice-color-text,rgb(23 23 23));text-decoration:none;transform:translateY(-200%);transition:transform var(--snice-transition-fast, 150ms) ease}.skip-link:focus-visible{transform:translateY(0);outline:var(--snice-focus-ring-width,2px) solid var(--snice-focus-ring-color,rgb(59 130 246 / .5));outline-offset:var(--snice-focus-ring-offset,2px)}.header{display:flex;align-items:center;gap:var(--snice-spacing-md,1rem);height:var(--snice-layout-docs-header-height,4rem);padding:0 var(--snice-spacing-lg,1.5rem);background:var(--snice-color-surface-container-high,rgb(252 251 249));border-bottom:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));position:relative;z-index:var(--snice-z-sticky,10)}.header-brand{display:flex;align-items:center;font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text,rgb(23 23 23));white-space:nowrap}.header-content{flex:1;min-width:0;display:flex;align-items:center;justify-content:flex-end;gap:var(--snice-spacing-md,1rem)}.sidebar-toggle{display:none;align-items:center;justify-content:center;width:var(--snice-layout-control-size,2rem);height:var(--snice-layout-control-size,2rem);background:0 0;border:none;color:var(--snice-color-text-secondary,rgb(82 82 82));cursor:pointer;padding:var(--snice-spacing-xs,.5rem);border-radius:var(--snice-border-radius-md,6px);transition:background var(--snice-transition-fast, 150ms) ease,color var(--snice-transition-fast, 150ms) ease}.sidebar-toggle:hover{background:var(--snice-color-surface-hover,var(--snice-color-overlay-hover,hsl(0 0% 0% / .06)));color:var(--snice-color-text,rgb(23 23 23))}.sidebar-toggle:focus-visible{outline:var(--snice-focus-ring-width,2px) solid var(--snice-focus-ring-color,rgb(59 130 246 / .5));outline-offset:var(--snice-focus-ring-offset,2px)}.body-area{position:relative;display:grid;grid-template-columns:var(--snice-layout-docs-nav-width,18.75rem) minmax(0,1fr) var(--snice-layout-docs-toc-width,18.75rem);min-height:0;overflow:hidden}.sidebar{overflow-y:auto;padding:var(--snice-spacing-lg,1.5rem) var(--snice-spacing-md,1rem);border-right:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));background:var(--snice-color-surface,rgb(255 255 255));transition:transform var(--snice-transition-normal, 250ms) ease}.sidebar ::slotted(a){display:block;padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-sm,.75rem);border-radius:var(--snice-border-radius-md,6px);color:var(--snice-color-text-secondary,rgb(82 82 82));text-decoration:none;transition:background var(--snice-transition-fast, 150ms) ease,color var(--snice-transition-fast, 150ms) ease}.sidebar ::slotted(a:hover){background:var(--snice-color-surface-hover,var(--snice-color-overlay-hover,hsl(0 0% 0% / .06)));color:var(--snice-color-text,rgb(23 23 23))}.sidebar ::slotted([aria-current]){background:var(--snice-color-primary-alpha,color-mix(in srgb,var(--snice-color-primary,rgb(37 99 235)) 10%,transparent));color:var(--snice-color-primary,rgb(37 99 235))}.scrim{display:none}.content{overflow-y:auto;padding:var(--snice-spacing-xl,2rem);min-width:0}.prose{max-width:var(--snice-layout-measure,65ch);margin-inline:auto}.prose ::slotted(h1),.prose ::slotted(h2),.prose ::slotted(h3),.prose ::slotted(h4){scroll-margin-top:calc(var(--snice-layout-docs-header-height,4rem) + var(--snice-spacing-md,1rem))}.footer{max-width:var(--snice-layout-measure,65ch);margin-inline:auto;padding-top:var(--snice-spacing-xl,2rem);color:var(--snice-color-text-secondary,rgb(82 82 82));font-size:var(--snice-font-size-sm, .875rem)}.toc{overflow-y:auto;padding:var(--snice-spacing-lg,1.5rem) var(--snice-spacing-md,1rem);border-left:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));font-size:var(--snice-font-size-sm, .875rem)}.toc ::slotted(*){position:sticky;top:0}@media (max-width:1152px){.body-area{grid-template-columns:var(--snice-layout-docs-nav-width,18.75rem) minmax(0,1fr)}.toc{display:none}}@media (max-width:996px){.sidebar-toggle{display:flex}.body-area{grid-template-columns:minmax(0,1fr)}.sidebar{position:absolute;top:0;bottom:0;left:0;z-index:var(--snice-z-overlay,1100);width:min(83vw,var(--snice-layout-docs-nav-width,18.75rem));transform:translateX(-105%);box-shadow:var(--snice-shadow-lg,0 10px 15px -3px rgb(0 0 0 / .1),0 4px 6px -4px rgb(0 0 0 / .1))}.sidebar--open{transform:translateX(0)}.scrim--visible{display:block;position:absolute;inset:0;z-index:var(--snice-z-scrim,1000);background:rgb(0 0 0 / .4)}.content{padding:var(--snice-spacing-lg,1.5rem)}.header{height:var(--snice-layout-docs-header-height-compact,3.5rem);padding:0 var(--snice-spacing-md,1rem)}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
1811
+
1812
+ /**
1813
+ * Documentation shell: navigation tree, prose at a reading measure, and an
1814
+ * on-this-page rail.
1815
+ *
1816
+ * The rail leaves first on narrower screens, then the tree becomes a drawer —
1817
+ * the order documentation sites settle on. Each region scrolls on its own.
1818
+ */
1819
+ (() => {
1820
+ let _classDecorators = [snice.element('snice-layout-docs')];
1821
+ let _classDescriptor;
1822
+ let _classExtraInitializers = [];
1823
+ let _classThis;
1824
+ let _classSuper = HTMLElement;
1825
+ let _instanceExtraInitializers = [];
1826
+ let _sidebarOpen_decorators;
1827
+ let _sidebarOpen_initializers = [];
1828
+ let _sidebarOpen_extraInitializers = [];
1829
+ let _contained_decorators;
1830
+ let _contained_initializers = [];
1831
+ let _contained_extraInitializers = [];
1832
+ let _hasToc_decorators;
1833
+ let _hasToc_initializers = [];
1834
+ let _hasToc_extraInitializers = [];
1835
+ let _render_decorators;
1836
+ let _styles_decorators;
1837
+ let _wireRegions_decorators;
1838
+ let _releaseListeners_decorators;
1839
+ (class extends _classSuper {
1840
+ static { _classThis = this; }
1841
+ constructor() {
1842
+ super(...arguments);
1843
+ /** Sidebar drawer state below the navigation breakpoint. */
1844
+ this.sidebarOpen = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _sidebarOpen_initializers, false));
1845
+ /** Size to the parent element instead of pinning to the viewport. */
1846
+ this.contained = (__runInitializers(this, _sidebarOpen_extraInitializers), __runInitializers(this, _contained_initializers, false));
1847
+ this.hasToc = (__runInitializers(this, _contained_extraInitializers), __runInitializers(this, _hasToc_initializers, false));
1848
+ this.navElement = __runInitializers(this, _hasToc_extraInitializers);
1849
+ this.placards = [];
1850
+ this.currentRoute = '';
1851
+ }
1852
+ static {
1853
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
1854
+ _sidebarOpen_decorators = [snice.property({ attribute: false })];
1855
+ _contained_decorators = [snice.property({ type: Boolean })];
1856
+ _hasToc_decorators = [snice.property({ attribute: false })];
1857
+ _render_decorators = [snice.render()];
1858
+ _styles_decorators = [snice.styles()];
1859
+ _wireRegions_decorators = [snice.ready()];
1860
+ _releaseListeners_decorators = [snice.dispose()];
1861
+ __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
1862
+ __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
1863
+ __esDecorate(this, null, _wireRegions_decorators, { kind: "method", name: "wireRegions", static: false, private: false, access: { has: obj => "wireRegions" in obj, get: obj => obj.wireRegions }, metadata: _metadata }, null, _instanceExtraInitializers);
1864
+ __esDecorate(this, null, _releaseListeners_decorators, { kind: "method", name: "releaseListeners", static: false, private: false, access: { has: obj => "releaseListeners" in obj, get: obj => obj.releaseListeners }, metadata: _metadata }, null, _instanceExtraInitializers);
1865
+ __esDecorate(null, null, _sidebarOpen_decorators, { kind: "field", name: "sidebarOpen", static: false, private: false, access: { has: obj => "sidebarOpen" in obj, get: obj => obj.sidebarOpen, set: (obj, value) => { obj.sidebarOpen = value; } }, metadata: _metadata }, _sidebarOpen_initializers, _sidebarOpen_extraInitializers);
1866
+ __esDecorate(null, null, _contained_decorators, { kind: "field", name: "contained", static: false, private: false, access: { has: obj => "contained" in obj, get: obj => obj.contained, set: (obj, value) => { obj.contained = value; } }, metadata: _metadata }, _contained_initializers, _contained_extraInitializers);
1867
+ __esDecorate(null, null, _hasToc_decorators, { kind: "field", name: "hasToc", static: false, private: false, access: { has: obj => "hasToc" in obj, get: obj => obj.hasToc, set: (obj, value) => { obj.hasToc = value; } }, metadata: _metadata }, _hasToc_initializers, _hasToc_extraInitializers);
1868
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
1869
+ _classThis = _classDescriptor.value;
1870
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
1871
+ __runInitializers(_classThis, _classExtraInitializers);
1872
+ }
1873
+ render() {
1874
+ const sidebarClass = this.sidebarOpen ? ' sidebar--open' : '';
1875
+ const scrimClass = this.sidebarOpen ? ' scrim--visible' : '';
1876
+ const tocClass = this.hasToc ? '' : ' toc--empty';
1877
+ return snice.html /*html*/ `
1878
+ <div class="layout">
1879
+ <a class="skip-link" href="#snice-docs-main">Skip to content</a>
1880
+
1881
+ <header class="header" part="header">
1882
+ <button
1883
+ class="sidebar-toggle"
1884
+ type="button"
1885
+ aria-label="Toggle documentation navigation"
1886
+ aria-expanded="${this.sidebarOpen}"
1887
+ @click=${this.handleSidebarToggle}
1888
+ >
1889
+ <svg viewBox="0 0 24 24" width="20" height="20">
1890
+ <path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z" fill="currentColor"/>
1891
+ </svg>
1892
+ </button>
1893
+ <div class="header-brand">
1894
+ <slot name="brand">
1895
+ <span class="brand-fallback">Documentation</span>
1896
+ </slot>
1897
+ </div>
1898
+ <div class="header-content">
1899
+ <slot name="header"></slot>
1900
+ </div>
1901
+ </header>
1902
+
1903
+ <div class="body-area">
1904
+ <nav class="sidebar${sidebarClass}" part="sidebar" aria-label="Documentation">
1905
+ <slot name="sidebar">
1906
+ <snice-nav class="sidebar-nav" variant="hierarchical" orientation="vertical"></snice-nav>
1907
+ </slot>
1908
+ </nav>
1909
+
1910
+ <div class="scrim${scrimClass}" part="scrim" @click=${this.handleScrimClick}></div>
1911
+
1912
+ <main class="content" id="snice-docs-main" part="main">
1913
+ <article class="prose" part="prose">
1914
+ <slot name="page"></slot>
1915
+ </article>
1916
+ <footer class="footer" part="footer">
1917
+ <slot name="footer"></slot>
1918
+ </footer>
1919
+ </main>
1920
+
1921
+ <aside class="toc${tocClass}" part="toc" aria-label="On this page">
1922
+ <slot name="toc"></slot>
1923
+ </aside>
1924
+ </div>
1925
+ </div>
1926
+ `;
1927
+ }
1928
+ styles() {
1929
+ return snice.css /*css*/ `${cssContent$6}`;
1930
+ }
1931
+ handleSidebarToggle() {
1932
+ this.sidebarOpen = !this.sidebarOpen;
1933
+ }
1934
+ handleScrimClick() {
1935
+ this.sidebarOpen = false;
1936
+ }
1937
+ wireRegions() {
1938
+ this.syncSlotState();
1939
+ this.shadowRoot?.addEventListener('slotchange', () => this.syncSlotState());
1940
+ if (typeof document !== 'undefined') {
1941
+ this.escapeListener = (event) => {
1942
+ if (event.key === 'Escape' && this.sidebarOpen)
1943
+ this.sidebarOpen = false;
1944
+ };
1945
+ document.addEventListener('keydown', this.escapeListener);
1946
+ }
1947
+ }
1948
+ releaseListeners() {
1949
+ if (this.escapeListener && typeof document !== 'undefined') {
1950
+ document.removeEventListener('keydown', this.escapeListener);
1951
+ this.escapeListener = undefined;
1952
+ }
1953
+ }
1954
+ syncSlotState() {
1955
+ this.hasToc = !!this.querySelector('[slot="toc"]');
1956
+ this.navElement = this.shadowRoot?.querySelector('snice-nav');
1957
+ }
1958
+ update(appContext, placards, currentRoute, routeParams) {
1959
+ this.placards = placards;
1960
+ this.currentRoute = currentRoute;
1961
+ this.updateNav(appContext, routeParams);
1962
+ }
1963
+ updateNav(appContext, routeParams) {
1964
+ const nav = this.navElement ?? this.shadowRoot?.querySelector('snice-nav');
1965
+ if (nav) {
1966
+ nav.update(this.placards, appContext, this.currentRoute, routeParams);
1967
+ }
1968
+ }
1969
+ });
1970
+ return _classThis;
1971
+ })();
1972
+
1973
+ var cssContent$5 = ":host{display:block;min-height:100%;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif)}:host(:not([contained])){position:fixed;inset:0}:host([contained]){position:relative;min-height:0;height:100%}.layout{position:relative;width:100%;height:100%;min-height:inherit;overflow:hidden;background:var(--snice-color-surface,hsl(var(--snice-color-gray-900,0 0% 9%)))}.background{position:absolute;inset:0;z-index:1}.overlay{position:absolute;inset:0;z-index:2;background:hsl(0 0% 0% / .5);opacity:0;transition:opacity var(--snice-transition-normal, .25s) ease;pointer-events:none}:host([overlay]) .overlay{opacity:1;pointer-events:auto}.content{position:absolute;inset:0;z-index:3;display:flex;align-items:center;justify-content:center;padding:var(--snice-spacing-lg,2rem)}.controls{position:absolute;bottom:0;left:0;right:0;z-index:4;padding:var(--snice-spacing-lg,2rem);background:linear-gradient(transparent,hsl(0 0% 0% / .8));transform:translateY(100%);transition:transform var(--snice-transition-normal, .25s) ease}:host(:hover) .controls{transform:translateY(0)}@media (max-width:768px){.controls{transform:translateY(0);background:hsl(0 0% 0% / .8)}.content{padding:var(--snice-spacing-md,1rem)}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
1974
+
1975
+ (() => {
1976
+ let _classDecorators = [snice.element('snice-layout-fullscreen')];
1977
+ let _classDescriptor;
1978
+ let _classExtraInitializers = [];
1979
+ let _classThis;
1980
+ let _classSuper = HTMLElement;
1981
+ let _instanceExtraInitializers = [];
1982
+ let _overlay_decorators;
1983
+ let _overlay_initializers = [];
1984
+ let _overlay_extraInitializers = [];
1985
+ let _contained_decorators;
1986
+ let _contained_initializers = [];
1987
+ let _contained_extraInitializers = [];
1988
+ let _render_decorators;
1989
+ let _styles_decorators;
1990
+ (class extends _classSuper {
1991
+ static { _classThis = this; }
1992
+ static {
1993
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
1994
+ _overlay_decorators = [snice.property({ type: Boolean, })];
1995
+ _contained_decorators = [snice.property({ type: Boolean })];
1996
+ _render_decorators = [snice.render()];
1997
+ _styles_decorators = [snice.styles()];
1998
+ __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
1999
+ __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
2000
+ __esDecorate(null, null, _overlay_decorators, { kind: "field", name: "overlay", static: false, private: false, access: { has: obj => "overlay" in obj, get: obj => obj.overlay, set: (obj, value) => { obj.overlay = value; } }, metadata: _metadata }, _overlay_initializers, _overlay_extraInitializers);
2001
+ __esDecorate(null, null, _contained_decorators, { kind: "field", name: "contained", static: false, private: false, access: { has: obj => "contained" in obj, get: obj => obj.contained, set: (obj, value) => { obj.contained = value; } }, metadata: _metadata }, _contained_initializers, _contained_extraInitializers);
2002
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
2003
+ _classThis = _classDescriptor.value;
2004
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
2005
+ __runInitializers(_classThis, _classExtraInitializers);
2006
+ }
2007
+ render() {
2008
+ return snice.html /*html*/ `
2009
+ <div class="layout">
2010
+ <div class="background">
2011
+ <slot name="background"></slot>
2012
+ </div>
2013
+
2014
+ <div class="overlay">
2015
+ <slot name="overlay"></slot>
2016
+ </div>
2017
+
2018
+ <div class="content">
2019
+ <slot name="page"></slot>
2020
+ </div>
2021
+
2022
+ <div class="controls">
2023
+ <slot name="controls"></slot>
2024
+ </div>
2025
+ </div>
2026
+ `;
2027
+ }
2028
+ styles() {
2029
+ return snice.css /*css*/ `${cssContent$5}`;
2030
+ }
2031
+ constructor() {
2032
+ super(...arguments);
2033
+ this.overlay = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _overlay_initializers, false));
2034
+ /** Size to the parent element instead of pinning to the viewport. */
2035
+ this.contained = (__runInitializers(this, _overlay_extraInitializers), __runInitializers(this, _contained_initializers, false));
2036
+ __runInitializers(this, _contained_extraInitializers);
2037
+ }
2038
+ });
2039
+ return _classThis;
2040
+ })();
2041
+
2042
+ var cssContent$4 = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);min-height:100vh;min-height:100dvh}:host([contained]){min-height:0}.layout{min-height:inherit;display:flex;flex-direction:column}.container{max-width:var(--snice-layout-container,80rem);margin:0 auto;padding:0 var(--snice-spacing-lg,2rem)}.header{background:color-mix(in srgb,var(--snice-color-surface,rgb(255 255 255)) 72%,transparent);backdrop-filter:saturate(1.4) blur(8px);-webkit-backdrop-filter:saturate(1.4) blur(8px);border-bottom:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));position:sticky;top:0;z-index:var(--snice-z-sticky,10)}.header .container{display:flex;align-items:center;justify-content:space-between;padding-top:var(--snice-spacing-md,1rem);padding-bottom:var(--snice-spacing-md,1rem)}.brand h1{font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);margin:0;font-size:var(--snice-heading-lg, 1.5rem);font-weight:var(--snice-font-weight-bold,700);color:var(--snice-color-text,rgb(23 23 23))}.nav{display:flex;gap:var(--snice-spacing-lg,2rem)}.nav ::slotted(a){text-decoration:none;color:var(--snice-color-text-secondary,rgb(82 82 82));font-weight:var(--snice-font-weight-medium,500);transition:color var(--snice-transition-fast, .15s) ease}.nav ::slotted(a:hover){color:var(--snice-color-primary,rgb(37 99 235))}.main{flex:1}.hero{background:var(--snice-color-surface-container-low,hsl(0 0% 98%));padding:var(--snice-spacing-2xl,4rem) 0}.content{background:var(--snice-color-surface,rgb(255 255 255))}.footer{background:var(--snice-color-surface-container,hsl(0 0% 95%));border-top:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));padding:var(--snice-spacing-xl,3rem) 0;margin-top:auto}@media (max-width:768px){.header .container{flex-direction:column;gap:var(--snice-spacing-md,1rem)}.nav{gap:var(--snice-spacing-md,1rem)}.hero{padding:var(--snice-spacing-xl,3rem) 0}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
2043
+
2044
+ (() => {
2045
+ let _classDecorators = [snice.element('snice-layout-landing')];
2046
+ let _classDescriptor;
2047
+ let _classExtraInitializers = [];
2048
+ let _classThis;
2049
+ let _classSuper = HTMLElement;
2050
+ let _instanceExtraInitializers = [];
2051
+ let _navElement_decorators;
2052
+ let _navElement_initializers = [];
2053
+ let _navElement_extraInitializers = [];
2054
+ let _useNav_decorators;
2055
+ let _useNav_initializers = [];
2056
+ let _useNav_extraInitializers = [];
2057
+ let _render_decorators;
2058
+ let _styles_decorators;
2059
+ (class extends _classSuper {
2060
+ static { _classThis = this; }
2061
+ constructor() {
2062
+ super(...arguments);
2063
+ this.navElement = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _navElement_initializers, void 0));
2064
+ this.useNav = (__runInitializers(this, _navElement_extraInitializers), __runInitializers(this, _useNav_initializers, false));
2065
+ this.placards = (__runInitializers(this, _useNav_extraInitializers), []);
2066
+ this.currentRoute = '';
2067
+ }
2068
+ static {
2069
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
2070
+ _navElement_decorators = [snice.query('snice-nav')];
2071
+ _useNav_decorators = [snice.property({ type: Boolean, attribute: 'use-nav' })];
2072
+ _render_decorators = [snice.render()];
2073
+ _styles_decorators = [snice.styles()];
2074
+ __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
2075
+ __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
2076
+ __esDecorate(null, null, _navElement_decorators, { kind: "field", name: "navElement", static: false, private: false, access: { has: obj => "navElement" in obj, get: obj => obj.navElement, set: (obj, value) => { obj.navElement = value; } }, metadata: _metadata }, _navElement_initializers, _navElement_extraInitializers);
2077
+ __esDecorate(null, null, _useNav_decorators, { kind: "field", name: "useNav", static: false, private: false, access: { has: obj => "useNav" in obj, get: obj => obj.useNav, set: (obj, value) => { obj.useNav = value; } }, metadata: _metadata }, _useNav_initializers, _useNav_extraInitializers);
2078
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
2079
+ _classThis = _classDescriptor.value;
2080
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
2081
+ __runInitializers(_classThis, _classExtraInitializers);
2082
+ }
2083
+ render() {
2084
+ return snice.html /*html*/ `
2085
+ <div class="layout">
2086
+ <header class="header">
2087
+ <div class="container">
2088
+ <div class="brand">
2089
+ <slot name="brand">
2090
+ <h1>Brand</h1>
2091
+ </slot>
2092
+ </div>
2093
+ <if ${this.useNav}>
2094
+ <snice-nav class="nav" variant="flat" orientation="horizontal"></snice-nav>
2095
+ </if>
2096
+ <if ${!this.useNav}>
2097
+ <nav class="nav">
2098
+ <slot name="nav"></slot>
2099
+ </nav>
2100
+ </if>
2101
+ <div class="cta">
2102
+ <slot name="cta"></slot>
2103
+ </div>
2104
+ </div>
2105
+ </header>
2106
+
2107
+ <main class="main">
2108
+ <section class="hero">
2109
+ <slot name="hero"></slot>
2110
+ </section>
2111
+
2112
+ <div class="content">
2113
+ <slot name="page"></slot>
2114
+ </div>
2115
+ </main>
2116
+
2117
+ <footer class="footer">
2118
+ <div class="container">
2119
+ <slot name="footer"></slot>
2120
+ </div>
2121
+ </footer>
2122
+ </div>
2123
+ `;
2124
+ }
2125
+ styles() {
2126
+ return snice.css /*css*/ `${cssContent$4}`;
2127
+ }
2128
+ update(appContext, placards, currentRoute, routeParams) {
2129
+ this.placards = placards;
2130
+ this.currentRoute = currentRoute;
2131
+ this.useNav = true;
2132
+ this.updateNav(appContext, routeParams);
2133
+ }
2134
+ updateNav(appContext, routeParams) {
2135
+ if (this.navElement) {
2136
+ this.navElement.update(this.placards, appContext, this.currentRoute, routeParams);
2137
+ }
2138
+ }
2139
+ });
2140
+ return _classThis;
2141
+ })();
2142
+
2143
+ var cssContent$3 = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif)}:host(:not([contained])){position:fixed;inset:0}:host([contained]){position:relative;min-height:0;height:100%}.layout{min-height:inherit;display:grid;grid-template-rows:auto 1fr;height:100%;background:var(--snice-color-surface,rgb(255 255 255))}.header{display:flex;align-items:center;gap:var(--snice-spacing-md,1rem);padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-lg,1.5rem);background:var(--snice-color-surface-container-high,rgb(252 251 249));border-bottom:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)))}.header:not(:has(slot[name=brand])):not(:has(slot[name=header])){display:none}.header-brand{display:flex;align-items:center;font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text,rgb(23 23 23))}.header-content{flex:1;min-width:0;display:flex;align-items:center;justify-content:flex-end;gap:var(--snice-spacing-md,1rem)}.back{display:flex;align-items:center;justify-content:center;width:var(--snice-layout-control-size,2rem);height:var(--snice-layout-control-size,2rem);background:0 0;border:none;color:var(--snice-color-text-secondary,rgb(82 82 82));cursor:pointer;padding:var(--snice-spacing-xs,.5rem);border-radius:var(--snice-border-radius-md,6px);transition:background var(--snice-transition-fast, 150ms) ease,color var(--snice-transition-fast, 150ms) ease}.back:hover{background:var(--snice-color-surface-hover,var(--snice-color-overlay-hover,hsl(0 0% 0% / .06)));color:var(--snice-color-text,rgb(23 23 23))}.back:focus-visible{outline:var(--snice-focus-ring-width,2px) solid var(--snice-focus-ring-color,rgb(59 130 246 / .5));outline-offset:var(--snice-focus-ring-offset,2px)}.body-area{display:flex;min-height:0;overflow:hidden}.pane{min-width:0;overflow-y:auto}.list{flex-shrink:0;width:var(--snice-layout-list-width,20rem);background:var(--snice-color-surface-container-low,rgb(250 250 250));border-right:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)))}.detail{flex:1;padding:var(--snice-spacing-xl,2rem)}.detail-empty{display:flex;align-items:center;justify-content:center;height:100%;color:var(--snice-color-text-tertiary,rgb(115 115 115))}@media (max-width:640px){.list{width:100%;border-right:none}.pane--hidden{display:none}.detail{padding:var(--snice-spacing-md,1rem)}.header{padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-md,1rem)}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
2144
+
2145
+ /**
2146
+ * Master-detail shell: a scrollable list beside the selected item's detail.
2147
+ * The mail, chat, and issue-tracker shape.
2148
+ *
2149
+ * Wide viewports show both panes. Below the breakpoint only one is on screen:
2150
+ * the list, until something is selected, then the detail with a back control.
2151
+ */
2152
+ (() => {
2153
+ let _classDecorators = [snice.element('snice-layout-master-detail')];
2154
+ let _classDescriptor;
2155
+ let _classExtraInitializers = [];
2156
+ let _classThis;
2157
+ let _classSuper = HTMLElement;
2158
+ let _instanceExtraInitializers = [];
2159
+ let _selected_decorators;
2160
+ let _selected_initializers = [];
2161
+ let _selected_extraInitializers = [];
2162
+ let _contained_decorators;
2163
+ let _contained_initializers = [];
2164
+ let _contained_extraInitializers = [];
2165
+ let _narrow_decorators;
2166
+ let _narrow_initializers = [];
2167
+ let _narrow_extraInitializers = [];
2168
+ let _render_decorators;
2169
+ let _styles_decorators;
2170
+ let _handleBack_decorators;
2171
+ let _watchViewport_decorators;
2172
+ let _releaseViewport_decorators;
2173
+ (class extends _classSuper {
2174
+ static { _classThis = this; }
2175
+ constructor() {
2176
+ super(...arguments);
2177
+ /** A detail item is open. Drives the single-pane view below the breakpoint. */
2178
+ this.selected = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _selected_initializers, false));
2179
+ /** Size to the parent element instead of pinning to the viewport. */
2180
+ this.contained = (__runInitializers(this, _selected_extraInitializers), __runInitializers(this, _contained_initializers, false));
2181
+ this.narrow = (__runInitializers(this, _contained_extraInitializers), __runInitializers(this, _narrow_initializers, false));
2182
+ this.placards = (__runInitializers(this, _narrow_extraInitializers), []);
2183
+ this.currentRoute = '';
2184
+ }
2185
+ static {
2186
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
2187
+ _selected_decorators = [snice.property({ type: Boolean })];
2188
+ _contained_decorators = [snice.property({ type: Boolean })];
2189
+ _narrow_decorators = [snice.property({ attribute: false })];
2190
+ _render_decorators = [snice.render()];
2191
+ _styles_decorators = [snice.styles()];
2192
+ _handleBack_decorators = [snice.dispatch('detail-closed', { bubbles: true, composed: true })];
2193
+ _watchViewport_decorators = [snice.ready()];
2194
+ _releaseViewport_decorators = [snice.dispose()];
2195
+ __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
2196
+ __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
2197
+ __esDecorate(this, null, _handleBack_decorators, { kind: "method", name: "handleBack", static: false, private: false, access: { has: obj => "handleBack" in obj, get: obj => obj.handleBack }, metadata: _metadata }, null, _instanceExtraInitializers);
2198
+ __esDecorate(this, null, _watchViewport_decorators, { kind: "method", name: "watchViewport", static: false, private: false, access: { has: obj => "watchViewport" in obj, get: obj => obj.watchViewport }, metadata: _metadata }, null, _instanceExtraInitializers);
2199
+ __esDecorate(this, null, _releaseViewport_decorators, { kind: "method", name: "releaseViewport", static: false, private: false, access: { has: obj => "releaseViewport" in obj, get: obj => obj.releaseViewport }, metadata: _metadata }, null, _instanceExtraInitializers);
2200
+ __esDecorate(null, null, _selected_decorators, { kind: "field", name: "selected", static: false, private: false, access: { has: obj => "selected" in obj, get: obj => obj.selected, set: (obj, value) => { obj.selected = value; } }, metadata: _metadata }, _selected_initializers, _selected_extraInitializers);
2201
+ __esDecorate(null, null, _contained_decorators, { kind: "field", name: "contained", static: false, private: false, access: { has: obj => "contained" in obj, get: obj => obj.contained, set: (obj, value) => { obj.contained = value; } }, metadata: _metadata }, _contained_initializers, _contained_extraInitializers);
2202
+ __esDecorate(null, null, _narrow_decorators, { kind: "field", name: "narrow", static: false, private: false, access: { has: obj => "narrow" in obj, get: obj => obj.narrow, set: (obj, value) => { obj.narrow = value; } }, metadata: _metadata }, _narrow_initializers, _narrow_extraInitializers);
2203
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
2204
+ _classThis = _classDescriptor.value;
2205
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
2206
+ __runInitializers(_classThis, _classExtraInitializers);
2207
+ }
2208
+ render() {
2209
+ const showDetail = !this.narrow || this.selected;
2210
+ const showList = !this.narrow || !this.selected;
2211
+ const listClass = showList ? '' : ' pane--hidden';
2212
+ const detailClass = showDetail ? '' : ' pane--hidden';
2213
+ return snice.html /*html*/ `
2214
+ <div class="layout">
2215
+ <header class="header" part="header">
2216
+ <if ${this.narrow && this.selected}>
2217
+ <button class="back" type="button" aria-label="Back to list" @click=${this.handleBack}>
2218
+ <svg viewBox="0 0 24 24" width="20" height="20">
2219
+ <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z" fill="currentColor"/>
2220
+ </svg>
2221
+ </button>
2222
+ </if>
2223
+ <div class="header-brand">
2224
+ <slot name="brand"></slot>
2225
+ </div>
2226
+ <div class="header-content">
2227
+ <slot name="header"></slot>
2228
+ </div>
2229
+ </header>
2230
+
2231
+ <div class="body-area">
2232
+ <section class="pane list${listClass}" part="list" aria-label="Items">
2233
+ <slot name="list"></slot>
2234
+ </section>
2235
+
2236
+ <section class="pane detail${detailClass}" part="detail" aria-label="Details">
2237
+ <slot name="detail">
2238
+ <div class="detail-empty" part="empty">
2239
+ <slot name="empty">Select an item</slot>
2240
+ </div>
2241
+ </slot>
2242
+ </section>
2243
+ </div>
2244
+ </div>
2245
+ `;
2246
+ }
2247
+ styles() {
2248
+ return snice.css /*css*/ `${cssContent$3}`;
2249
+ }
2250
+ handleBack() {
2251
+ this.selected = false;
2252
+ return { selected: false };
2253
+ }
2254
+ watchViewport() {
2255
+ if (typeof window === 'undefined' || typeof window.matchMedia !== 'function')
2256
+ return;
2257
+ this.viewportQuery = window.matchMedia('(max-width: 640px)');
2258
+ this.narrow = this.viewportQuery.matches;
2259
+ this.viewportListener = (event) => {
2260
+ this.narrow = event.matches;
2261
+ };
2262
+ this.viewportQuery.addEventListener('change', this.viewportListener);
2263
+ }
2264
+ releaseViewport() {
2265
+ if (this.viewportQuery && this.viewportListener) {
2266
+ this.viewportQuery.removeEventListener('change', this.viewportListener);
2267
+ this.viewportQuery = undefined;
2268
+ this.viewportListener = undefined;
2269
+ }
2270
+ }
2271
+ update(_appContext, placards, currentRoute, _routeParams) {
2272
+ this.placards = placards;
2273
+ this.currentRoute = currentRoute;
2274
+ }
2275
+ });
2276
+ return _classThis;
2277
+ })();
2278
+
2279
+ var cssContent$2 = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);min-height:100vh;min-height:100dvh}:host([contained]){min-height:0}.layout{min-height:inherit;display:flex;flex-direction:column}.main{flex:1;background:var(--snice-color-surface,rgb(255 255 255))}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
2280
+
2281
+ (() => {
2282
+ let _classDecorators = [snice.element('snice-layout-minimal')];
2283
+ let _classDescriptor;
2284
+ let _classExtraInitializers = [];
2285
+ let _classThis;
2286
+ let _classSuper = HTMLElement;
2287
+ let _instanceExtraInitializers = [];
2288
+ let _render_decorators;
2289
+ let _styles_decorators;
2290
+ (class extends _classSuper {
2291
+ static { _classThis = this; }
2292
+ static {
2293
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
2294
+ _render_decorators = [snice.render()];
2295
+ _styles_decorators = [snice.styles()];
2296
+ __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
2297
+ __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
2298
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
2299
+ _classThis = _classDescriptor.value;
2300
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
2301
+ __runInitializers(_classThis, _classExtraInitializers);
2302
+ }
2303
+ render() {
2304
+ return snice.html /*html*/ `
2305
+ <div class="layout">
2306
+ <main class="main">
2307
+ <slot name="page"></slot>
2308
+ </main>
2309
+ </div>
2310
+ `;
2311
+ }
2312
+ styles() {
2313
+ return snice.css /*css*/ `${cssContent$2}`;
2314
+ }
2315
+ constructor() {
2316
+ super(...arguments);
2317
+ __runInitializers(this, _instanceExtraInitializers);
2318
+ }
2319
+ });
2320
+ return _classThis;
2321
+ })();
2322
+
2323
+ var cssContent$1 = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif)}:host(:not([contained])){position:fixed;inset:0}:host([contained]){position:relative;min-height:0;height:100%}.layout{display:grid;grid-template-rows:auto 1fr auto;min-height:100%}.header{display:flex;align-items:center;gap:var(--snice-spacing-md,1rem);padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-lg,1.5rem);background:var(--snice-color-surface-container-high,rgb(252 251 249));border-bottom:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));position:relative;z-index:var(--snice-z-sticky,10)}.header-brand{display:flex;align-items:center}.header-brand h2{font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);margin:0;font-size:var(--snice-heading-md, 1.125rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text,rgb(23 23 23));white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sidebar-toggle{display:flex;align-items:center;justify-content:center;width:var(--snice-layout-control-size,2rem);height:var(--snice-layout-control-size,2rem);background:0 0;border:none;color:var(--snice-color-text-secondary,rgb(82 82 82));cursor:pointer;padding:var(--snice-spacing-xs,.5rem);border-radius:var(--snice-border-radius-md,6px);transition:all var(--snice-transition-fast, 150ms) ease}.sidebar-toggle:hover{background:var(--snice-color-surface-hover,var(--snice-color-overlay-hover,hsl(0 0% 0% / .04)));color:var(--snice-color-text,rgb(23 23 23))}.sidebar-toggle:focus-visible{outline:var(--snice-focus-ring-width,2px) solid var(--snice-focus-ring-color,rgb(59 130 246 / .5));outline-offset:var(--snice-focus-ring-offset,2px)}.header-content{flex:1;min-width:0;display:flex;align-items:center;gap:var(--snice-spacing-md,1rem)}.header-content ::slotted(*){flex:1;width:100%}.body-area{position:relative;display:flex;flex:1;overflow:hidden;background:var(--snice-color-surface,rgb(255 255 255))}.sidebar{flex-shrink:0;width:var(--snice-layout-sidebar-width,16rem);background:var(--snice-color-surface-container-low,rgb(250 250 250));border-right:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)));overflow-y:auto;overflow-x:hidden;padding-block:var(--snice-spacing-sm,0.75rem);transition:width var(--snice-transition-normal, 250ms) ease,transform var(--snice-transition-normal, 250ms) ease}.sidebar--collapsed{width:0;border-right:none}.sidebar--rail.sidebar--collapsed{width:var(--snice-layout-rail-collapsed-width,3rem);border-right:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)))}.sidebar--rail.sidebar--collapsed ::slotted(*){overflow:hidden;white-space:nowrap}.scrim{display:none}.sidebar ::slotted(a),.sidebar ::slotted(button){display:flex;align-items:center;gap:var(--snice-spacing-sm,.75rem);padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-md,1rem);margin:0 var(--snice-spacing-xs,.5rem);border-radius:var(--snice-border-radius-md,6px);color:var(--snice-color-text-secondary,rgb(82 82 82));text-decoration:none;cursor:pointer;transition:background var(--snice-transition-fast, 150ms) ease,color var(--snice-transition-fast, 150ms) ease}.sidebar ::slotted(a:hover),.sidebar ::slotted(button:hover){background:var(--snice-color-surface-hover,var(--snice-color-overlay-hover,hsl(0 0% 0% / .06)));color:var(--snice-color-text,rgb(23 23 23))}.sidebar ::slotted(a:focus-visible),.sidebar ::slotted(button:focus-visible){outline:var(--snice-focus-ring-width,2px) solid var(--snice-focus-ring-color,rgb(59 130 246 / .5));outline-offset:var(--snice-focus-ring-offset,2px)}.sidebar ::slotted([aria-current]){background:var(--snice-color-primary-alpha,color-mix(in srgb,var(--snice-color-primary,rgb(37 99 235)) 10%,transparent));color:var(--snice-color-primary,rgb(37 99 235))}.sidebar-nav{display:flex;flex-direction:column;gap:var(--snice-spacing-sm,.75rem);padding:var(--snice-spacing-md,1rem)}.main{flex:1;padding:var(--snice-spacing-xl,2rem);overflow-y:auto;background:var(--snice-color-surface,rgb(255 255 255));position:relative;z-index:0}.footer{padding:var(--snice-spacing-md,1rem) var(--snice-spacing-lg,1.5rem);background:var(--snice-color-surface-container,hsl(0 0% 95%));border-top:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)))}.footer--empty{display:none}@media (max-width:768px){.header{padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-md,1rem)}.sidebar{position:absolute;top:0;bottom:0;left:0;z-index:var(--snice-z-overlay,1100);width:min(80vw,18rem);transform:translateX(-105%);box-shadow:var(--snice-shadow-lg,0 10px 15px -3px rgb(0 0 0 / .1),0 4px 6px -4px rgb(0 0 0 / .1))}.sidebar--collapsed,.sidebar--rail.sidebar--collapsed{width:min(80vw,18rem);border-right:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)))}.sidebar--mobile-open{transform:translateX(0)}.scrim--visible{display:block;position:absolute;inset:0;z-index:var(--snice-z-scrim,1000);background:rgb(0 0 0 / .4)}.main{padding:var(--snice-spacing-md,1rem)}.footer{padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-md,1rem)}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
2324
+
2325
+ (() => {
2326
+ let _classDecorators = [snice.element('snice-layout-sidebar')];
2327
+ let _classDescriptor;
2328
+ let _classExtraInitializers = [];
2329
+ let _classThis;
2330
+ let _classSuper = HTMLElement;
2331
+ let _instanceExtraInitializers = [];
2332
+ let _collapsed_decorators;
2333
+ let _collapsed_initializers = [];
2334
+ let _collapsed_extraInitializers = [];
2335
+ let _contained_decorators;
2336
+ let _contained_initializers = [];
2337
+ let _contained_extraInitializers = [];
2338
+ let _collapseMode_decorators;
2339
+ let _collapseMode_initializers = [];
2340
+ let _collapseMode_extraInitializers = [];
2341
+ let _mobileOpen_decorators;
2342
+ let _mobileOpen_initializers = [];
2343
+ let _mobileOpen_extraInitializers = [];
2344
+ let _navElement_decorators;
2345
+ let _navElement_initializers = [];
2346
+ let _navElement_extraInitializers = [];
2347
+ let _hasFooterContent_decorators;
2348
+ let _hasFooterContent_initializers = [];
2349
+ let _hasFooterContent_extraInitializers = [];
2350
+ let _render_decorators;
2351
+ let _styles_decorators;
2352
+ let _handleKeydown_decorators;
2353
+ let _wireFooterState_decorators;
2354
+ let _bindShortcut_decorators;
2355
+ let _releaseShortcut_decorators;
2356
+ let _init_decorators;
2357
+ (class extends _classSuper {
2358
+ static { _classThis = this; }
2359
+ constructor() {
2360
+ super(...arguments);
2361
+ this.collapsed = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _collapsed_initializers, false));
2362
+ /** Size to the parent element instead of pinning to the viewport. */
2363
+ this.contained = (__runInitializers(this, _collapsed_extraInitializers), __runInitializers(this, _contained_initializers, false));
2364
+ /**
2365
+ * How the sidebar collapses on desktop:
2366
+ * `rail` shrinks it to an icon-width column, `offcanvas` hides it entirely,
2367
+ * `none` pins it open and drops the toggle.
2368
+ */
2369
+ this.collapseMode = (__runInitializers(this, _contained_extraInitializers), __runInitializers(this, _collapseMode_initializers, 'rail'));
2370
+ this.mobileOpen = (__runInitializers(this, _collapseMode_extraInitializers), __runInitializers(this, _mobileOpen_initializers, false));
2371
+ this.navElement = (__runInitializers(this, _mobileOpen_extraInitializers), __runInitializers(this, _navElement_initializers, void 0));
2372
+ this.placards = (__runInitializers(this, _navElement_extraInitializers), []);
2373
+ this.currentRoute = '';
2374
+ this.hasFooterContent = __runInitializers(this, _hasFooterContent_initializers, false);
2375
+ this.shortcutListener = __runInitializers(this, _hasFooterContent_extraInitializers);
2376
+ }
2377
+ static {
2378
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
2379
+ _collapsed_decorators = [snice.property({ type: Boolean })];
2380
+ _contained_decorators = [snice.property({ type: Boolean })];
2381
+ _collapseMode_decorators = [snice.property({ attribute: 'collapse-mode' })];
2382
+ _mobileOpen_decorators = [snice.property({ attribute: false })];
2383
+ _navElement_decorators = [snice.query('snice-nav')];
2384
+ _hasFooterContent_decorators = [snice.property({ attribute: false })];
2385
+ _render_decorators = [snice.render()];
2386
+ _styles_decorators = [snice.styles()];
2387
+ _handleKeydown_decorators = [snice.on('keydown')];
2388
+ _wireFooterState_decorators = [snice.ready()];
2389
+ _bindShortcut_decorators = [snice.ready()];
2390
+ _releaseShortcut_decorators = [snice.dispose()];
2391
+ _init_decorators = [snice.ready()];
2392
+ __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
2393
+ __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
2394
+ __esDecorate(this, null, _handleKeydown_decorators, { kind: "method", name: "handleKeydown", static: false, private: false, access: { has: obj => "handleKeydown" in obj, get: obj => obj.handleKeydown }, metadata: _metadata }, null, _instanceExtraInitializers);
2395
+ __esDecorate(this, null, _wireFooterState_decorators, { kind: "method", name: "wireFooterState", static: false, private: false, access: { has: obj => "wireFooterState" in obj, get: obj => obj.wireFooterState }, metadata: _metadata }, null, _instanceExtraInitializers);
2396
+ __esDecorate(this, null, _bindShortcut_decorators, { kind: "method", name: "bindShortcut", static: false, private: false, access: { has: obj => "bindShortcut" in obj, get: obj => obj.bindShortcut }, metadata: _metadata }, null, _instanceExtraInitializers);
2397
+ __esDecorate(this, null, _releaseShortcut_decorators, { kind: "method", name: "releaseShortcut", static: false, private: false, access: { has: obj => "releaseShortcut" in obj, get: obj => obj.releaseShortcut }, metadata: _metadata }, null, _instanceExtraInitializers);
2398
+ __esDecorate(this, null, _init_decorators, { kind: "method", name: "init", static: false, private: false, access: { has: obj => "init" in obj, get: obj => obj.init }, metadata: _metadata }, null, _instanceExtraInitializers);
2399
+ __esDecorate(null, null, _collapsed_decorators, { kind: "field", name: "collapsed", static: false, private: false, access: { has: obj => "collapsed" in obj, get: obj => obj.collapsed, set: (obj, value) => { obj.collapsed = value; } }, metadata: _metadata }, _collapsed_initializers, _collapsed_extraInitializers);
2400
+ __esDecorate(null, null, _contained_decorators, { kind: "field", name: "contained", static: false, private: false, access: { has: obj => "contained" in obj, get: obj => obj.contained, set: (obj, value) => { obj.contained = value; } }, metadata: _metadata }, _contained_initializers, _contained_extraInitializers);
2401
+ __esDecorate(null, null, _collapseMode_decorators, { kind: "field", name: "collapseMode", static: false, private: false, access: { has: obj => "collapseMode" in obj, get: obj => obj.collapseMode, set: (obj, value) => { obj.collapseMode = value; } }, metadata: _metadata }, _collapseMode_initializers, _collapseMode_extraInitializers);
2402
+ __esDecorate(null, null, _mobileOpen_decorators, { kind: "field", name: "mobileOpen", static: false, private: false, access: { has: obj => "mobileOpen" in obj, get: obj => obj.mobileOpen, set: (obj, value) => { obj.mobileOpen = value; } }, metadata: _metadata }, _mobileOpen_initializers, _mobileOpen_extraInitializers);
2403
+ __esDecorate(null, null, _navElement_decorators, { kind: "field", name: "navElement", static: false, private: false, access: { has: obj => "navElement" in obj, get: obj => obj.navElement, set: (obj, value) => { obj.navElement = value; } }, metadata: _metadata }, _navElement_initializers, _navElement_extraInitializers);
2404
+ __esDecorate(null, null, _hasFooterContent_decorators, { kind: "field", name: "hasFooterContent", static: false, private: false, access: { has: obj => "hasFooterContent" in obj, get: obj => obj.hasFooterContent, set: (obj, value) => { obj.hasFooterContent = value; } }, metadata: _metadata }, _hasFooterContent_initializers, _hasFooterContent_extraInitializers);
2405
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
2406
+ _classThis = _classDescriptor.value;
2407
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
2408
+ __runInitializers(_classThis, _classExtraInitializers);
2409
+ }
2410
+ render() {
2411
+ const isRail = this.collapseMode === 'rail';
2412
+ const canCollapse = this.collapseMode !== 'none';
2413
+ const sidebarRailClass = isRail ? ' sidebar--rail' : '';
2414
+ const sidebarCollapsedClass = canCollapse && this.collapsed ? ' sidebar--collapsed' : '';
2415
+ const sidebarMobileClass = this.mobileOpen ? ' sidebar--mobile-open' : '';
2416
+ const scrimClass = this.mobileOpen ? ' scrim--visible' : '';
2417
+ const expanded = this.mobileOpen || !this.collapsed;
2418
+ return snice.html /*html*/ `
2419
+ <div class="layout">
2420
+ <header class="header" part="header">
2421
+ <if ${canCollapse}>
2422
+ <button class="sidebar-toggle" type="button" aria-label="Toggle sidebar" aria-expanded="${expanded}" @click=${this.handleSidebarToggle}>
2423
+ <svg viewBox="0 0 24 24" width="20" height="20">
2424
+ <path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z" fill="currentColor"/>
2425
+ </svg>
2426
+ </button>
2427
+ </if>
2428
+ <div class="header-brand">
2429
+ <slot name="brand">
2430
+ <h2>App</h2>
2431
+ </slot>
2432
+ </div>
2433
+ <div class="header-content">
2434
+ <slot name="header"></slot>
2435
+ </div>
2436
+ </header>
2437
+
2438
+ <div class="body-area">
2439
+ <aside class="sidebar${sidebarRailClass}${sidebarCollapsedClass}${sidebarMobileClass}" part="sidebar">
2440
+ <slot name="sidebar">
2441
+ <snice-nav class="sidebar-nav" variant="hierarchical" orientation="vertical"></snice-nav>
2442
+ </slot>
2443
+ </aside>
2444
+
2445
+ <div class="scrim${scrimClass}" part="scrim" @click=${this.handleScrimClick}></div>
2446
+
2447
+ <main class="main" part="main">
2448
+ <slot name="page"></slot>
2449
+ </main>
2450
+ </div>
2451
+
2452
+ <footer class="footer${this.hasFooterContent ? '' : ' footer--empty'}" part="footer">
2453
+ <slot name="footer"></slot>
2454
+ </footer>
2455
+ </div>
2456
+ `;
2457
+ }
2458
+ styles() {
2459
+ return snice.css /*css*/ `${cssContent$1}`;
2460
+ }
2461
+ handleSidebarToggle() {
2462
+ if (this.collapseMode === 'none')
2463
+ return;
2464
+ const isMobileViewport = typeof window !== 'undefined'
2465
+ && typeof window.matchMedia === 'function'
2466
+ && window.matchMedia('(max-width: 768px)').matches;
2467
+ if (isMobileViewport) {
2468
+ this.mobileOpen = !this.mobileOpen;
2469
+ return;
2470
+ }
2471
+ this.collapsed = !this.collapsed;
2472
+ }
2473
+ handleScrimClick() {
2474
+ this.mobileOpen = false;
2475
+ }
2476
+ handleKeydown(event) {
2477
+ if (event.key === 'Escape' && this.mobileOpen) {
2478
+ this.mobileOpen = false;
2479
+ }
2480
+ }
2481
+ wireFooterState() {
2482
+ this.syncFooterState();
2483
+ this.shadowRoot?.addEventListener('slotchange', () => this.syncFooterState());
2484
+ }
2485
+ syncFooterState() {
2486
+ this.hasFooterContent = !!this.querySelector('[slot="footer"]');
2487
+ }
2488
+ bindShortcut() {
2489
+ if (typeof document === 'undefined')
2490
+ return;
2491
+ this.shortcutListener = (event) => {
2492
+ const isToggleChord = event.key?.toLowerCase() === 'b' && (event.metaKey || event.ctrlKey);
2493
+ if (!isToggleChord)
2494
+ return;
2495
+ event.preventDefault();
2496
+ this.handleSidebarToggle();
2497
+ };
2498
+ document.addEventListener('keydown', this.shortcutListener);
2499
+ }
2500
+ releaseShortcut() {
2501
+ if (this.shortcutListener && typeof document !== 'undefined') {
2502
+ document.removeEventListener('keydown', this.shortcutListener);
2503
+ this.shortcutListener = undefined;
2504
+ }
2505
+ }
2506
+ init() {
2507
+ // Update nav when component is ready and shadow DOM is available
2508
+ this.updateNav();
2509
+ }
2510
+ update(appContext, placards, currentRoute, routeParams) {
2511
+ this.placards = placards;
2512
+ this.currentRoute = currentRoute;
2513
+ // Update the navigation
2514
+ this.updateNav(appContext, routeParams);
2515
+ }
2516
+ updateNav(appContext, routeParams) {
2517
+ if (this.navElement) {
2518
+ this.navElement.update(this.placards, appContext, this.currentRoute, routeParams);
2519
+ }
2520
+ }
2521
+ });
2522
+ return _classThis;
2523
+ })();
2524
+
2525
+ var cssContent = ":host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);min-height:100vh;min-height:100dvh}:host([contained]){min-height:0}.layout{display:grid;min-height:inherit;gap:1px;background:var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)))}:host(:not([direction])) .layout,:host([direction=horizontal]) .layout{grid-template-columns:1fr auto 1fr;grid-template-rows:1fr}:host([direction=vertical]) .layout{grid-template-rows:1fr auto 1fr;grid-template-columns:1fr}:host(:not([ratio])) .layout,:host([ratio=\"50-50\"]) .layout{grid-template-columns:1fr 1px 1fr}:host([ratio=\"60-40\"]) .layout{grid-template-columns:60fr 1px 40fr}:host([ratio=\"70-30\"]) .layout{grid-template-columns:70fr 1px 30fr}:host([ratio=\"33-67\"]) .layout{grid-template-columns:33fr 1px 67fr}:host([ratio=\"67-33\"]) .layout{grid-template-columns:67fr 1px 33fr}:host([direction=vertical]:not([ratio])) .layout,:host([direction=vertical][ratio=\"50-50\"]) .layout{grid-template-rows:1fr 1px 1fr}:host([direction=vertical][ratio=\"60-40\"]) .layout{grid-template-rows:60fr 1px 40fr}:host([direction=vertical][ratio=\"70-30\"]) .layout{grid-template-rows:70fr 1px 30fr}:host([direction=vertical][ratio=\"33-67\"]) .layout{grid-template-rows:33fr 1px 67fr}:host([direction=vertical][ratio=\"67-33\"]) .layout{grid-template-rows:67fr 1px 33fr}.panel{background:var(--snice-color-surface,rgb(255 255 255));overflow:auto}.panel-left,.panel-right{padding:var(--snice-spacing-lg,2rem)}.divider{background:var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)))}@media (max-width:768px){.layout{grid-template-columns:1fr!important;grid-template-rows:auto auto auto!important}.divider{height:1px}.panel-left,.panel-right{padding:var(--snice-spacing-md,1rem)}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
2526
+
2527
+ (() => {
2528
+ let _classDecorators = [snice.element('snice-layout-split')];
2529
+ let _classDescriptor;
2530
+ let _classExtraInitializers = [];
2531
+ let _classThis;
2532
+ let _classSuper = HTMLElement;
2533
+ let _instanceExtraInitializers = [];
2534
+ let _direction_decorators;
2535
+ let _direction_initializers = [];
2536
+ let _direction_extraInitializers = [];
2537
+ let _ratio_decorators;
2538
+ let _ratio_initializers = [];
2539
+ let _ratio_extraInitializers = [];
2540
+ let _render_decorators;
2541
+ let _styles_decorators;
2542
+ (class extends _classSuper {
2543
+ static { _classThis = this; }
2544
+ static {
2545
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
2546
+ _direction_decorators = [snice.property({})];
2547
+ _ratio_decorators = [snice.property({})];
2548
+ _render_decorators = [snice.render()];
2549
+ _styles_decorators = [snice.styles()];
2550
+ __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
2551
+ __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
2552
+ __esDecorate(null, null, _direction_decorators, { kind: "field", name: "direction", static: false, private: false, access: { has: obj => "direction" in obj, get: obj => obj.direction, set: (obj, value) => { obj.direction = value; } }, metadata: _metadata }, _direction_initializers, _direction_extraInitializers);
2553
+ __esDecorate(null, null, _ratio_decorators, { kind: "field", name: "ratio", static: false, private: false, access: { has: obj => "ratio" in obj, get: obj => obj.ratio, set: (obj, value) => { obj.ratio = value; } }, metadata: _metadata }, _ratio_initializers, _ratio_extraInitializers);
2554
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
2555
+ _classThis = _classDescriptor.value;
2556
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
2557
+ __runInitializers(_classThis, _classExtraInitializers);
2558
+ }
2559
+ render() {
2560
+ return snice.html /*html*/ `
2561
+ <div class="layout">
2562
+ <div class="panel panel-left">
2563
+ <slot name="left"></slot>
2564
+ </div>
2565
+ <div class="divider"></div>
2566
+ <div class="panel panel-right">
2567
+ <slot name="right"></slot>
2568
+ </div>
2569
+ </div>
2570
+ `;
2571
+ }
2572
+ styles() {
2573
+ return snice.css /*css*/ `${cssContent}`;
2574
+ }
2575
+ constructor() {
2576
+ super(...arguments);
2577
+ this.direction = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _direction_initializers, 'horizontal'));
2578
+ this.ratio = (__runInitializers(this, _direction_extraInitializers), __runInitializers(this, _ratio_initializers, '50-50'));
2579
+ __runInitializers(this, _ratio_extraInitializers);
2580
+ }
2581
+ });
2582
+ return _classThis;
2583
+ })();
939
2584
 
940
- })({}, Snice);
2585
+ })(Snice);
941
2586
  //# sourceMappingURL=snice-layout.js.map