@pgcorp/ui-kit 0.14.0 → 0.15.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 (117) hide show
  1. package/README.md +330 -12
  2. package/dist/assets/src/components/layout/{SResizeHandle.vue_vue_type_style_index_0_scoped_13b9b27a_lang.css → SResizeHandle.vue_vue_type_style_index_0_scoped_dc65aba1_lang.css} +1 -1
  3. package/dist/assets/src/components/shared/_internal/SDialogSurface.css_vue_type_style_index_0_src_a108e8f1_scoped_a108e8f1_lang.css +2 -0
  4. package/dist/assets/src/components/shared/containers/{SCollapsiblePanel.css_vue_type_style_index_0_src_71824088_scoped_71824088_lang.css → SCollapsiblePanel.css_vue_type_style_index_0_src_db85261d_scoped_db85261d_lang.css} +1 -1
  5. package/dist/assets/src/components/shared/containers/{SOverlayHost.css_vue_type_style_index_0_src_8f9be94e_scoped_8f9be94e_lang.css → SOverlayHost.css_vue_type_style_index_0_src_09215628_scoped_09215628_lang.css} +1 -1
  6. package/dist/assets/src/components/shared/containers/{SPopover.css_vue_type_style_index_0_src_4091d007_scoped_4091d007_lang.css → SPopover.css_vue_type_style_index_0_src_a4f1f64a_scoped_a4f1f64a_lang.css} +1 -1
  7. package/dist/assets/src/components/shared/containers/SSidebarSection.css_vue_type_style_index_0_src_52396e42_scoped_52396e42_lang.css +2 -0
  8. package/dist/assets/src/components/shared/controls/SButton.css_vue_type_style_index_0_src_7a5acda9_scoped_7a5acda9_lang.css +1 -1
  9. package/dist/assets/src/components/shared/controls/SCheckbox.css_vue_type_style_index_0_src_2562f916_scoped_2562f916_lang.css +2 -0
  10. package/dist/assets/src/components/shared/controls/SCombobox.css_vue_type_style_index_0_src_d630c922_scoped_d630c922_lang.css +2 -0
  11. package/dist/assets/src/components/shared/controls/SContextMenu.css_vue_type_style_index_0_src_43b6e378_scoped_43b6e378_lang.css +1 -0
  12. package/dist/assets/src/components/shared/controls/{SDropdownMenu.css_vue_type_style_index_0_src_857e2649_scoped_857e2649_lang.css → SDropdownMenu.css_vue_type_style_index_0_src_40040ae5_scoped_40040ae5_lang.css} +1 -1
  13. package/dist/assets/src/components/shared/controls/{SMenuSurface.css_vue_type_style_index_0_src_84109ad9_scoped_84109ad9_lang.css → SMenuSurface.css_vue_type_style_index_0_src_d2b7d71b_scoped_d2b7d71b_lang.css} +1 -1
  14. package/dist/assets/src/components/shared/controls/SSelect.css_vue_type_style_index_0_src_d1ead6c0_scoped_d1ead6c0_lang.css +2 -0
  15. package/dist/assets/src/components/shared/data-display/SControlledToastViewport.css_vue_type_style_index_0_src_a69aa84b_scoped_a69aa84b_lang.css +2 -0
  16. package/dist/assets/src/components/shared/data-display/SScrollViewport.css_vue_type_style_index_0_src_d94fcf8c_scoped_d94fcf8c_lang.css +2 -0
  17. package/dist/assets/src/components/shared/data-display/STooltip.css_vue_type_style_index_0_src_true_lang.css +1 -1
  18. package/dist/assets/src/components/shared/data-display/_internal/STableFrame.css_vue_type_style_index_0_src_914bad28_scoped_914bad28_lang.css +2 -0
  19. package/dist/assets/src/components/shared/navigation/{SBottomNav.vue_vue_type_style_index_0_scoped_24be0f2b_lang.css → SBottomNav.vue_vue_type_style_index_0_scoped_68cf84b3_lang.css} +1 -1
  20. package/dist/src/components/layout/SResizeHandle.vue.js +2 -2
  21. package/dist/src/components/layout/SResizeHandle.vue_vue_type_script_setup_true_lang.js +4 -2
  22. package/dist/src/components/shared/_internal/SDialogSurface.vue.d.ts +9 -1
  23. package/dist/src/components/shared/_internal/SDialogSurface.vue.js +2 -2
  24. package/dist/src/components/shared/_internal/SDialogSurface.vue_vue_type_script_setup_true_lang.js +174 -82
  25. package/dist/src/components/shared/_internal/dialogSurface.d.ts +2 -0
  26. package/dist/src/components/shared/_internal/dialogSurface.js +30 -27
  27. package/dist/src/components/shared/_internal/dialogSurfaceMotion.d.ts +14 -0
  28. package/dist/src/components/shared/_internal/dialogSurfaceMotion.js +84 -0
  29. package/dist/src/components/shared/_internal/focusTrap.js +15 -13
  30. package/dist/src/components/shared/containers/SCollapsiblePanel.vue.d.ts +5 -0
  31. package/dist/src/components/shared/containers/SCollapsiblePanel.vue.js +2 -2
  32. package/dist/src/components/shared/containers/SCollapsiblePanel.vue_vue_type_script_setup_true_lang.js +123 -121
  33. package/dist/src/components/shared/containers/SDrawer.vue.d.ts +4 -4
  34. package/dist/src/components/shared/containers/SDrawer.vue.js +3 -6
  35. package/dist/src/components/shared/containers/SDrawer.vue_vue_type_script_setup_true_lang.js +104 -128
  36. package/dist/src/components/shared/containers/SModal.vue.d.ts +8 -8
  37. package/dist/src/components/shared/containers/SModal.vue.js +3 -6
  38. package/dist/src/components/shared/containers/SModal.vue_vue_type_script_setup_true_lang.js +87 -103
  39. package/dist/src/components/shared/containers/SOverlayHost.vue.js +2 -2
  40. package/dist/src/components/shared/containers/SOverlayHost.vue_vue_type_script_setup_true_lang.js +32 -31
  41. package/dist/src/components/shared/containers/SPanel.vue.d.ts +1 -1
  42. package/dist/src/components/shared/containers/SPopover.vue.js +2 -2
  43. package/dist/src/components/shared/containers/SPopover.vue_vue_type_script_setup_true_lang.js +225 -200
  44. package/dist/src/components/shared/containers/SSidebarSection.vue.js +2 -2
  45. package/dist/src/components/shared/containers/SSidebarSection.vue_vue_type_script_setup_true_lang.js +4 -3
  46. package/dist/src/components/shared/controls/SCheckbox.vue.js +2 -2
  47. package/dist/src/components/shared/controls/SCheckbox.vue_vue_type_script_setup_true_lang.js +13 -7
  48. package/dist/src/components/shared/controls/SCombobox.vue.js +2 -2
  49. package/dist/src/components/shared/controls/SCombobox.vue_vue_type_script_setup_true_lang.js +104 -94
  50. package/dist/src/components/shared/controls/SContextMenu.vue.js +2 -2
  51. package/dist/src/components/shared/controls/SContextMenu.vue_vue_type_script_setup_true_lang.js +86 -81
  52. package/dist/src/components/shared/controls/SDropdownMenu.vue.js +2 -2
  53. package/dist/src/components/shared/controls/SDropdownMenu.vue_vue_type_script_setup_true_lang.js +77 -72
  54. package/dist/src/components/shared/controls/SMenuSurface.vue.js +2 -2
  55. package/dist/src/components/shared/controls/SMenuSurface.vue_vue_type_script_setup_true_lang.js +81 -77
  56. package/dist/src/components/shared/controls/SSelect.vue.js +2 -2
  57. package/dist/src/components/shared/controls/SSelect.vue_vue_type_script_setup_true_lang.js +85 -77
  58. package/dist/src/components/shared/data-display/SControlledToastViewport.vue.js +2 -2
  59. package/dist/src/components/shared/data-display/SControlledToastViewport.vue_vue_type_script_setup_true_lang.js +58 -49
  60. package/dist/src/components/shared/data-display/SScrollViewport.vue.d.ts +10 -5
  61. package/dist/src/components/shared/data-display/SScrollViewport.vue.js +2 -2
  62. package/dist/src/components/shared/data-display/SScrollViewport.vue_vue_type_script_setup_true_lang.js +162 -111
  63. package/dist/src/components/shared/data-display/STooltip.vue_vue_type_script_setup_true_lang.js +276 -224
  64. package/dist/src/components/shared/data-display/_internal/STableFrame.vue.d.ts +3 -3
  65. package/dist/src/components/shared/data-display/_internal/STableFrame.vue.js +2 -2
  66. package/dist/src/components/shared/data-display/_internal/STableFrame.vue_vue_type_script_setup_true_lang.js +62 -46
  67. package/dist/src/components/shared/data-display/scrollViewport.d.ts +2 -0
  68. package/dist/src/components/shared/navigation/SBottomNav.vue.js +2 -2
  69. package/dist/src/components/shared/navigation/SBottomNav.vue_vue_type_script_setup_true_lang.js +3 -1
  70. package/dist/src/components/shared/navigation/STabList.vue.d.ts +1 -1
  71. package/dist/src/composables/useDialogOverlay.d.ts +12 -2
  72. package/dist/src/composables/useDialogOverlay.js +192 -119
  73. package/dist/src/internal/flatTree.d.ts +8 -0
  74. package/dist/src/internal/flatTree.js +23 -0
  75. package/dist/src/internal/focusNavigation.d.ts +3 -0
  76. package/dist/src/internal/focusNavigation.js +28 -15
  77. package/dist/src/internal/inertLease.d.ts +8 -0
  78. package/dist/src/internal/inertLease.js +33 -0
  79. package/dist/src/internal/layerStack.d.ts +40 -0
  80. package/dist/src/internal/layerStack.js +301 -94
  81. package/dist/src/internal/nativeFocus.d.ts +4 -0
  82. package/dist/src/internal/nativeFocus.js +12 -0
  83. package/dist/src/internal/overlayPortal.d.ts +17 -0
  84. package/dist/src/internal/overlayPortal.js +23 -0
  85. package/dist/src/internal/semanticSizing.d.ts +2 -2
  86. package/dist/src/internal/semanticSizing.js +2 -1
  87. package/dist/src/internal/useMenuLayer.d.ts +1 -0
  88. package/dist/src/internal/useMenuLayer.js +63 -57
  89. package/dist/src/internal/viewportModality.d.ts +27 -0
  90. package/dist/src/internal/viewportModality.js +132 -0
  91. package/dist/typography.js +17 -62
  92. package/docs/overlay-lifecycle.md +195 -0
  93. package/docs/public-api.md +141 -4
  94. package/docs/resize.md +34 -5
  95. package/docs/scroll-viewport.md +30 -10
  96. package/docs/theming.md +42 -8
  97. package/package.json +1 -1
  98. package/src/components/shared/_internal/SDialogSurface.css +185 -40
  99. package/src/components/shared/controls/SButton.css +0 -3
  100. package/src/components/shared/controls/SCheckbox.css +19 -7
  101. package/src/components/shared/data-display/SControlledToastViewport.css +2 -10
  102. package/src/components/shared/data-display/SScrollViewport.css +17 -1
  103. package/src/components/shared/data-display/STooltip.css +1 -1
  104. package/src/components/shared/data-display/_internal/STableFrame.css +1 -5
  105. package/dist/assets/src/components/shared/_internal/SDialogSurface.css_vue_type_style_index_0_src_0e58afdc_scoped_0e58afdc_lang.css +0 -2
  106. package/dist/assets/src/components/shared/containers/SDrawer.css_vue_type_style_index_0_src_61cf20dd_scoped_61cf20dd_lang.css +0 -2
  107. package/dist/assets/src/components/shared/containers/SModal.css_vue_type_style_index_0_src_42e1bd5f_scoped_42e1bd5f_lang.css +0 -2
  108. package/dist/assets/src/components/shared/containers/SSidebarSection.css_vue_type_style_index_0_src_21f71ae8_scoped_21f71ae8_lang.css +0 -2
  109. package/dist/assets/src/components/shared/controls/SCheckbox.css_vue_type_style_index_0_src_55d4826e_scoped_55d4826e_lang.css +0 -2
  110. package/dist/assets/src/components/shared/controls/SCombobox.css_vue_type_style_index_0_src_537f5744_scoped_537f5744_lang.css +0 -2
  111. package/dist/assets/src/components/shared/controls/SContextMenu.css_vue_type_style_index_0_src_03921269_scoped_03921269_lang.css +0 -1
  112. package/dist/assets/src/components/shared/controls/SSelect.css_vue_type_style_index_0_src_df3d6688_scoped_df3d6688_lang.css +0 -2
  113. package/dist/assets/src/components/shared/data-display/SControlledToastViewport.css_vue_type_style_index_0_src_5864b6c6_scoped_5864b6c6_lang.css +0 -2
  114. package/dist/assets/src/components/shared/data-display/SScrollViewport.css_vue_type_style_index_0_src_e5d11342_scoped_e5d11342_lang.css +0 -2
  115. package/dist/assets/src/components/shared/data-display/_internal/STableFrame.css_vue_type_style_index_0_src_52b5825e_scoped_52b5825e_lang.css +0 -2
  116. package/src/components/shared/containers/SDrawer.css +0 -87
  117. package/src/components/shared/containers/SModal.css +0 -27
package/README.md CHANGED
@@ -331,12 +331,32 @@ semantic block size, overscroll policy и root-only keyboard navigation.
331
331
  semantic offsets. Exposed API предоставляет `focus`, `scrollToBoundary` и
332
332
  `reveal`, но не открывает DOM owner.
333
333
 
334
+ `focusPolicy="always"` сохраняет именованную region; `focusPolicy="overflow"`
335
+ добавляет region и Tab stop только при переполнении разрешённой оси. Имя задаётся
336
+ ровно одним из `accessibleLabel` и `accessibleLabelledby`. `blockSize="content"`
337
+ сохраняет естественную высоту, `maxBlockSize="none|sm|md|lg"` ограничивает её
338
+ общей шкалой viewport. Таблицы `STable`, `SDataGrid` и rich-document используют
339
+ этот общий scroll owner: пустые и пассивные таблицы доступны клавиатуре при
340
+ переполнении, вложенные controls сохраняют собственную клавиатуру.
341
+ При исчезновении переполнения focused root сохраняет `tabindex="-1"` до blur;
342
+ он не добавляет остановку Tab и не переносит фокус.
343
+
334
344
  `SScrollViewport` owns a named scroll region, `x`/`y`/`both` axes, semantic
335
345
  block size, overscroll policy, and root-only keyboard navigation. The
336
346
  `scroll-state` event provides normalized physical and writing-mode-aware
337
347
  semantic offsets. Its exposed API provides `focus`, `scrollToBoundary`, and
338
348
  `reveal` without exposing the DOM owner.
339
349
 
350
+ `focusPolicy="always"` retains the named region; `focusPolicy="overflow"`
351
+ adds a region and Tab stop only when an enabled axis overflows. Exactly one
352
+ of `accessibleLabel` and `accessibleLabelledby` supplies its name.
353
+ `blockSize="content"` retains intrinsic height; `maxBlockSize="none|sm|md|lg"`
354
+ uses the shared viewport limit scale. `STable`, `SDataGrid`, and rich-document
355
+ tables compose this scroll owner: overflowing empty and passive tables are
356
+ keyboard reachable, while nested controls retain their own keyboard behavior.
357
+ When overflow disappears, a focused root retains `tabindex="-1"` until blur;
358
+ it adds no Tab stop and does not move focus.
359
+
340
360
  ```ts
341
361
  import SScrollViewport from '@pgcorp/ui-kit/shared/data-display/SScrollViewport.vue'
342
362
  import type {
@@ -704,6 +724,29 @@ limited preview is not the download source. `SLink.disabled` and
704
724
  Контракт, Blob lifecycle и ограничения браузера включены в пакет: `docs/link-download.md`.
705
725
  The package includes the contract, Blob lifecycle, and browser limitations in `docs/link-download.md`.
706
726
 
727
+ ### Идентичность динамических вкладок / Dynamic tab identity
728
+
729
+ В managed-композиции `STabs` значение `modelValue`, `STab.name` и
730
+ `STabPanel.name` используют один стабильный ID сущности. Vue `key` также
731
+ основан на этом ID. Добавление элемента и выбор его ID допускаются в одной
732
+ reactive update, включая вставку в начало массива. Порядковый номер и подпись
733
+ вкладки являются отображением, а не идентичностью.
734
+
735
+ Для E2E consumer задаёт собственные `data-*` маркеры по ID и проверяет роль
736
+ `tab`, `aria-selected`, связь `aria-controls` с ID панели и обратную
737
+ `aria-labelledby`. Внутренний формат DOM ID, `nth()` и индекс в подписи не
738
+ являются selector-контрактом. Сохранённые панели сохраняют свой input при
739
+ переключении; ручная DOM-активация и remount для выбора не требуются.
740
+
741
+ In managed `STabs`, `modelValue`, `STab.name`, `STabPanel.name`, and Vue `key`
742
+ use the same stable entity ID. Adding a keyed item and selecting its ID can
743
+ occur in one reactive update, including insertion at the beginning. An ordinal
744
+ or label is presentation, not identity. E2E tests use consumer-owned `data-*`
745
+ IDs, the `tab` role, `aria-selected`, and the matching `aria-controls` /
746
+ `aria-labelledby` relationship. Internal DOM ID formats, `nth()`, and label
747
+ indices are not selector contracts. Retained panels preserve their input;
748
+ selection does not require manual DOM activation or remounting.
749
+
707
750
  ### Подсказка на интерактивной поверхности / Tooltip on an interactive surface
708
751
 
709
752
  `SInteractiveSurface` принимает полный combined `trigger` от `STooltip` через
@@ -724,6 +767,33 @@ focus и activation независимо от primary owner.
724
767
  Blur окна, скрытие документа, disabled и освобождение target отменяют
725
768
  таймеры и слушатели. Новый вход указателя или получение фокуса открывает
726
769
  подсказку по действующему `showDelay`.
770
+ Canonical focus owner допускает binding внутри сохранённой скрытой секции.
771
+ Скрытый или недоступный owner не активирует подсказку. Скрытие ancestor
772
+ отменяет pending-таймеры, сразу исключает открытую панель из взаимодействия
773
+ и снимает description. Reveal сохраняет owner; новый pointer/focus вход
774
+ открывает подсказку без дополнительного Tab stop.
775
+
776
+ Пассивная tooltip-поверхность передаёт полный `text`/`title`/`description`,
777
+ `details` и `sections` как доступное описание focus owner через
778
+ `aria-describedby`; внешние `triggerDescribedBy` сохраняются. Визуальный
779
+ portal имеет `aria-hidden="true"`, исключая повторное самостоятельное чтение
780
+ того же текста вне landmark. Пассивная поверхность прозрачна для указателя:
781
+ нажатие достигает расположенного под ней действия, а наведение на видимый
782
+ контент сохраняет текущую подсказку. Имя и роль owner не изменяются. Подсказка не
783
+ содержит интерактивных действий; для popup с controls используется другой
784
+ overlay-компонент. Описание связывается при показе панели, включая открытие
785
+ по возвращённому фокусу после закрытия dialog.
786
+
787
+ The passive tooltip surface exposes all text, title, description, details,
788
+ and sections as the focus owner's accessible description through
789
+ `aria-describedby`, preserving external `triggerDescribedBy` references.
790
+ The visual portal has `aria-hidden="true"` to avoid duplicating that description
791
+ as independent content outside a landmark. The passive surface is pointer-transparent:
792
+ native activation reaches the underlying action while hovering the displayed content
793
+ keeps its current tooltip lease open. The owner's name and role remain
794
+ unchanged. A tooltip contains no interactive actions; use another overlay
795
+ component for a popup with controls. The description is associated when the
796
+ surface is shown, including focus restored after a dialog closes.
727
797
 
728
798
  `SInteractiveSurface` accepts the complete combined `STooltip` trigger through
729
799
  the `tooltipTrigger` prop. The binding belongs to the primary activation owner:
@@ -742,6 +812,11 @@ opening; a pending tooltip does not consume the event from a menu or dialog.
742
812
  Window blur, a hidden document, disabled state, and released target identity
743
813
  cancel timers and listeners. Fresh pointer entry or acquired focus opens the
744
814
  tooltip according to its current `showDelay`.
815
+ A canonical focus owner can bind inside a retained hidden section. A hidden
816
+ or unavailable owner cannot activate the tooltip. Hiding its ancestor
817
+ cancels pending timers, immediately retires the open panel from interaction,
818
+ and removes its description. Revealing the section retains the owner;
819
+ fresh pointer/focus entry opens the tooltip without another Tab stop.
745
820
 
746
821
  ```vue
747
822
  <STooltip text="/workspace/repository" v-slot="{ trigger }">
@@ -1116,6 +1191,20 @@ focus, and keyboard contracts remain unchanged.
1116
1191
  </SButton>
1117
1192
  ```
1118
1193
 
1194
+ ### Доступность действий / Action availability
1195
+
1196
+ `SButton.disabled` и `loading` исключают native activation и Tab focus;
1197
+ недоступная `href`-кнопка не содержит navigation target. При разрешении
1198
+ действия foreground и background применяются одной контрастной парой без
1199
+ интерполяции цветов. Действие доступно сразу, без ожидания декоративной
1200
+ анимации; transition тени и transform не меняет читаемость подписи.
1201
+
1202
+ `SButton.disabled` and `loading` prevent native activation and Tab focus;
1203
+ an unavailable `href` button has no navigation target. Enabling an action
1204
+ applies its foreground/background contrast pair atomically, without color
1205
+ interpolation. The action is immediately available, independently of
1206
+ decorative shadow or transform transitions.
1207
+
1119
1208
  ### Controlled checkbox и switch / Controlled checkbox and switch
1120
1209
 
1121
1210
  `SCheckbox` и `SSwitch` всегда отражают authoritative `modelValue` в native
@@ -1132,6 +1221,22 @@ supports asynchronous persistence or rejection without rekeying, manual DOM
1132
1221
  resets, or an optimistic model. The consumer updates `modelValue` normally
1133
1222
  after confirmation.
1134
1223
 
1224
+ У `SCheckbox` единственный focus owner — native checkbox. Прозрачный input
1225
+ покрывает индикатор и его pointer target; нажатие на индикатор или связанную
1226
+ подпись выполняет одно действие. Обычный field использует semantic hitbox
1227
+ `--s-control-hitbox-2xs`, inline-представление — размер индикатора, согласованный
1228
+ со строкой документа. Tab переводит фокус на input, Space переключает его,
1229
+ focus-visible отображается на индикаторе. `disabled` и `readonly` не эмитят
1230
+ изменение или click; `indeterminate` показывает частичный выбор через минус.
1231
+
1232
+ `SCheckbox` has one focus owner: the native checkbox. Its transparent input
1233
+ covers the indicator and its pointer target; activating the indicator or its
1234
+ associated label performs one action. Field presentation uses the semantic
1235
+ `--s-control-hitbox-2xs` target; inline presentation uses the indicator size
1236
+ aligned with document text. Tab focuses the input, Space toggles it, and the
1237
+ indicator renders focus-visible. `disabled` and `readonly` emit neither change
1238
+ intent nor click; `indeterminate` represents partial selection with a minus.
1239
+
1135
1240
  ```vue
1136
1241
  <SSwitch
1137
1242
  :model-value="autoPublish"
@@ -1176,6 +1281,14 @@ contract applies only to textual types: `text`, `search`, `password`, `email`,
1176
1281
  используют общие viewport overlay, focus trap/restore, Escape, backdrop и nested
1177
1282
  layer stack.
1178
1283
 
1284
+ Viewport `SModal` и `SDrawer` используют единственный нативный `dialog` в
1285
+ modal top layer. Фон, включая SVG, MathML и shadow-композиции, исключён из
1286
+ pointer/focus interaction и accessibility tree. Дочерние select, меню, popover
1287
+ и tooltip используют принадлежащий этому dialog portal вне transform и
1288
+ scroll clipping. Вложенный viewport dialog изолирует родителя до закрытия.
1289
+ Native blocking освобождается синхронно при retirement; общая focus lease
1290
+ управляет возвратом, независимо от завершения visual leave.
1291
+
1179
1292
  `SDrawer.placement` accepts `left | right | bottom`, defaulting to `right`.
1180
1293
  `left` and `right` are physical sides independent of text direction. Side
1181
1294
  drawers share the `sm/md/lg` scale: viewport-bounded maximum widths of
@@ -1187,6 +1300,30 @@ placement, header/body/footer and reachable actions. With
1187
1300
  share viewport overlay, focus trap/restore, Escape, backdrop and the nested
1188
1301
  layer stack.
1189
1302
 
1303
+ Viewport `SModal` and `SDrawer` use one native `dialog` in the modal top layer.
1304
+ Background content, including SVG, MathML, and shadow compositions, is excluded
1305
+ from pointer/focus interaction and the accessibility tree. Descendant selects,
1306
+ menus, popovers, and tooltips use that dialog's portal outside transforms and
1307
+ scroll clipping. A nested viewport dialog isolates its parent until closed.
1308
+ Retirement releases native blocking synchronously; the shared focus lease
1309
+ controls restoration independently of visual leave completion.
1310
+
1311
+ Для обновления на `0.15` готовые `SModal`/`SDrawer` сохраняют публичные props,
1312
+ slots и events. Собственный viewport leaf на экспортируемом `useDialogOverlay`
1313
+ требует миграции: `setPanelElement` получает native `HTMLDialogElement`, а
1314
+ `setPortalElement` — его непосредственный дочерний HTMLElement portal.
1315
+ Разметка, стили принадлежащих leaf surfaces и controlled close описаны в
1316
+ [`docs/overlay-lifecycle.md`](https://github.com/pglyanenko/sputnig/blob/master/packages/ui-kit/docs/overlay-lifecycle.md),
1317
+ включая карту binding исполняемой story `SModal.NativeOwnerContract`.
1318
+
1319
+ For an upgrade to `0.15`, the ready-made `SModal`/`SDrawer` preserve their public
1320
+ props, slots, and events. A custom viewport leaf using the exported
1321
+ `useDialogOverlay` requires migration: `setPanelElement` receives a native
1322
+ `HTMLDialogElement`, and `setPortalElement` receives its direct-child HTMLElement
1323
+ portal. The owned markup, styles, and controlled close contract are documented in
1324
+ [`docs/overlay-lifecycle.md`](https://github.com/pglyanenko/sputnig/blob/master/packages/ui-kit/docs/overlay-lifecycle.md),
1325
+ including the binding map of the executable `SModal.NativeOwnerContract` story.
1326
+
1190
1327
  `scope="contained"` требует ближайший `SOverlayHost`. Его default-слот содержит
1191
1328
  основную историю, `#overlay` — панель. Размеры `sm/md/lg` означают 50/70/90%
1192
1329
  доступной области по оси `placement`; `extent` принимает конечный процент больше
@@ -1285,19 +1422,47 @@ drawer with `open=true` represent a new request, not the previous lifetime.
1285
1422
  </SDrawer>
1286
1423
  ```
1287
1424
 
1425
+ ### Передача фокуса из меню / Menu focus handoff
1426
+
1427
+ Открытие `SDrawer` из действия `SDropdownMenu` передаёт initial focus
1428
+ диалогу и сохраняет устойчивый menu trigger для возврата при закрытии.
1429
+ Меню и его trigger могут находиться вне contained host. Удаление временного
1430
+ menuitem в render-cycle не делает его целью возврата и не расширяет
1431
+ Escape boundary за пределы host. Повторные открытия используют отдельный
1432
+ open-cycle. Внешний переход фокуса отменяет незавершённую передачу и stale
1433
+ return; consumer не восстанавливает фокус DOM-вызовом.
1434
+
1435
+ Передача относится к текущему open intent и связанному завершению menu
1436
+ lifetime. Произвольное ожидание сервера перед первым запросом открытия не
1437
+ сохраняет право перехватить последующий внешний фокус.
1438
+
1439
+ Opening `SDrawer` from an `SDropdownMenu` action transfers initial focus
1440
+ to the dialog and retains the stable menu trigger for restoration on close.
1441
+ The menu and its trigger may live outside a contained host. Removing the
1442
+ transient menu item during rendering neither makes it a restoration target
1443
+ nor extends Escape handling beyond the host. Repeated openings have separate
1444
+ open cycles. An external focus change cancels pending handoff and stale
1445
+ restoration; consumers do not restore focus with DOM calls.
1446
+
1447
+ Handoff belongs to the current opening intent and the associated menu
1448
+ retirement. Arbitrary server work before the first opening request does not
1449
+ preserve permission to take subsequent external focus.
1450
+
1288
1451
  ### Dialog heading hierarchy
1289
1452
 
1290
1453
  `SModal` и `SDrawer` используют `heading-level="2"` по умолчанию: самостоятельный
1291
1454
  диалог следует за основным `h1` страницы. Для диалога, вложенного в секцию или
1292
1455
  другой dialog surface, consumer передаёт фактический уровень document outline
1293
- числом от `1` до `6`. Видимый заголовок при любом уровне остаётся accessible name
1456
+ числом от `1` до `6`. Локальная шапка диалога не создаёт page-level `banner`.
1457
+ Видимый заголовок при любом уровне остаётся accessible name
1294
1458
  через `aria-labelledby`; заменять его локальным заголовком или DOM-обходом не
1295
1459
  нужно.
1296
1460
 
1297
1461
  `SModal` and `SDrawer` default to `heading-level="2"`, so a standalone dialog
1298
1462
  follows the page's primary `h1`. A dialog nested in a section or another dialog
1299
1463
  surface receives its actual document-outline level from the consumer as an
1300
- integer from `1` through `6`. At every level the visible title remains the
1464
+ integer from `1` through `6`. Local dialog chrome does not create a page-level
1465
+ `banner` landmark. At every level the visible title remains the
1301
1466
  accessible name through `aria-labelledby`; no local heading or DOM workaround
1302
1467
  is required.
1303
1468
 
@@ -1332,6 +1497,11 @@ before the error reaches the host application.
1332
1497
  через prop использует текущий focus owner. `close()` отменяет ожидающий запрос
1333
1498
  через `update:open=false`; закрытие восстанавливает фокус только из принадлежащей
1334
1499
  панели, не из внешнего поля. Каждый новый цикл использует актуального invoker.
1500
+ Удаление или отключение текущего focused action оставляет панель открытой;
1501
+ Принятое закрытие через Escape восстанавливает focus доступному
1502
+ зарегистрированному trigger. Явный blur
1503
+ доступного элемента и переход во внешний focus owner закрывают панель
1504
+ по outside-политике без перехвата внешнего focus.
1335
1505
 
1336
1506
  `SPopover` supports `v-model:open` and the programmatic `open(triggerId?)`/`close()`
1337
1507
  API. A trigger request preserves its native anchor and original focus owner
@@ -1340,6 +1510,11 @@ take focus from an external editor focused in the meantime. Direct prop-driven
1340
1510
  opening uses the current focus owner. `close()` cancels a pending request with
1341
1511
  `update:open=false`; closing restores focus only from the owned panel, not an
1342
1512
  external field. Each new cycle uses its current invoker.
1513
+ Removing or disabling the currently focused action keeps the panel open;
1514
+ An accepted Escape close restores focus to the available registered trigger.
1515
+ Explicitly blurring an
1516
+ available element or moving to an external focus owner dismisses the panel
1517
+ under its outside policy without taking external focus.
1343
1518
 
1344
1519
  `width="trigger"` задаёт минимальную ширину anchor; `content` сохраняет
1345
1520
  intrinsic-ширину содержимого. `sm`, `md`, `lg` задают `20rem`, `28rem`, `36rem`
@@ -1353,6 +1528,22 @@ bounded by the viewport. Background, shadow, and focus surface occupy the full
1353
1528
  dialog; `surface="transparent"` sets the entire dialog's maximum width to `90vw`.
1354
1529
  With `width="trigger"`, the anchor minimum takes precedence over this maximum.
1355
1530
 
1531
+ ### Читаемость всплывающих поверхностей / Overlay motion readability
1532
+
1533
+ `SDrawer`, `SPopover`, `STooltip`, `SContextMenu` и
1534
+ `SControlledToastViewport` сохраняют `opacity: 1` содержимого
1535
+ при открытии и закрытии. Прозрачность выбранного фона принадлежит surface
1536
+ контракту, а не анимации. Анимация использует перемещение и масштаб;
1537
+ backdrop имеет отдельный opacity transition. Reduced-motion предпочтение,
1538
+ focus ownership и keyboard dismissal принадлежат общим owners кита.
1539
+
1540
+ `SDrawer`, `SPopover`, `STooltip`, `SContextMenu`, and
1541
+ `SControlledToastViewport` keep content at `opacity: 1` during entry and
1542
+ exit. Background translucency belongs to the selected surface contract,
1543
+ not the animation. Motion uses translation and scale; the backdrop has an independent
1544
+ opacity transition. Reduced-motion preference, focus ownership, and keyboard
1545
+ dismissal belong to the kit's shared owners.
1546
+
1356
1547
  ### Управляемое dropdown menu / Controlled dropdown menu
1357
1548
 
1358
1549
  `SDropdownMenu` поддерживает controlled `v-model:open`, начальное
@@ -1415,6 +1606,63 @@ Escape closes the current level and returns focus to its trigger.
1415
1606
  `SButton` disclosure hitbox at `32px`; `comfortable` retains the default
1416
1607
  geometry. Consumers do not set height, padding, or internal selectors.
1417
1608
 
1609
+ ### Семантика сворачиваемой панели / Collapsible panel semantics
1610
+
1611
+ `SCollapsiblePanel.contentRole` принимает `region | group`; по умолчанию
1612
+ `region`. Самостоятельные, значимые для навигации разделы используют
1613
+ `region`; повторяемые и вложенные сведения — `group`, не создающий
1614
+ landmark. Обе роли сохраняют доступное имя из видимого `summary` через
1615
+ `aria-labelledby` и связь с disclosure trigger через `aria-controls`.
1616
+ Повторяемые группы могут иметь одинаковые пользовательские заголовки.
1617
+ Роль задаётся prop, не raw `role` attr; неизвестное значение вызывает
1618
+ ошибку контракта. `lazy` монтирует slot при первом принятом раскрытии
1619
+ и удерживает содержимое после сворачивания, включая анимированный
1620
+ неуправляемый режим.
1621
+
1622
+ Controlled `open` эмитит `update:open` как намерение до подтверждения prop;
1623
+ uncontrolled режим изменяет собственное состояние без этого события.
1624
+
1625
+ Принятое сворачивание сразу исключает content из клавиатурного обхода и
1626
+ дерева доступности через `inert` и `aria-hidden`; завершающая визуальная
1627
+ анимация сохраняет mounted slot. Фокус внутри закрываемого content
1628
+ возвращается доступному trigger через его публичный focus API. Внешний
1629
+ фокус и неподтверждённое controlled намерение не перехватываются.
1630
+ Motion завершается по фактическому переходу высоты или сразу при его
1631
+ отсутствии; reduced motion, повторное раскрытие и изменение содержимого
1632
+ не требуют ожиданий или DOM-вызовов consumer.
1633
+
1634
+ `SCollapsiblePanel.contentRole` accepts `region | group` and defaults to
1635
+ `region`. Independently significant, navigable sections use `region`;
1636
+ repeated and nested details use the non-landmark `group`. Both roles
1637
+ retain an accessible name from the visible `summary` through
1638
+ `aria-labelledby` and the trigger relationship through `aria-controls`.
1639
+ Repeated groups may share the same user-facing heading. The role is
1640
+ specified by a prop, not a raw `role` attr; an unknown value fails the
1641
+ contract. `lazy` mounts the slot on its first accepted opening and retains
1642
+ the content after collapse, including animated uncontrolled mode.
1643
+
1644
+ Controlled `open` emits an `update:open` intent before prop acknowledgement;
1645
+ uncontrolled mode updates its owned state without that event.
1646
+
1647
+ An accepted collapse immediately excludes content from keyboard navigation
1648
+ and the accessibility tree using `inert` and `aria-hidden`; the closing
1649
+ visual transition retains the mounted slot. Focus inside the collapsing
1650
+ content returns to an available trigger through its public focus API.
1651
+ External focus and unacknowledged controlled intent are not intercepted.
1652
+ Motion settles on the actual height transition or immediately when none
1653
+ exists; reduced motion, reopening, and content changes require no consumer
1654
+ waits or DOM calls.
1655
+
1656
+ ```vue
1657
+ <SCollapsiblePanel summary="Технические сведения" content-role="group" lazy>
1658
+ <SInputText v-model="connectionName" label="Имя подключения" />
1659
+ </SCollapsiblePanel>
1660
+ ```
1661
+
1662
+ [APG Accordion](https://www.w3.org/WAI/ARIA/apg/patterns/accordion/) рассматривает
1663
+ landmark role как необязательный; [ARIA group](https://www.w3.org/TR/wai-aria-1.2/#group)
1664
+ предназначен для локальной группировки без включения в оглавление страницы.
1665
+
1418
1666
  ### Dialog open lifecycle
1419
1667
 
1420
1668
  `SModal` и `SDrawer` эмитят `opened` один раз для каждого подтверждённого цикла
@@ -1431,6 +1679,42 @@ focus. The handler can call a nested leaf's public exposed API, such as
1431
1679
  cancels the event; Escape, focus trapping, and focus restoration remain owned
1432
1680
  by the dialog surface.
1433
1681
 
1682
+ Закрытие через `open=false` и удаление открытой feature-формы через `v-if`
1683
+ поддерживают один focus-контракт, включая удаление формы в том же обработчике,
1684
+ который закрывает вложенное или соседнее подтверждение. После удаления
1685
+ владеющего фокусом dialog focus возвращается подключённому, видимому инициатору,
1686
+ допустимому в текущей modal boundary. Consumer не ожидает отдельное событие
1687
+ закрытия и не вызывает DOM `focus()`/`nextTick()` для восстановления. Новый
1688
+ overlay или явное перемещение фокуса отменяют отложенный возврат. Скрытие
1689
+ retained dock и аварийное освобождение overlay не возвращают focus скрытому
1690
+ или inert инициатору.
1691
+
1692
+ Retained dialog сохраняет право возврата после удаления или отключения
1693
+ focused action во время асинхронной операции. Утрата native focus
1694
+ определяется по завершённому DOM-обновлению: focus остаётся на BODY, а
1695
+ наблюдённый descendant удалён или потерял native focus capability.
1696
+ Отдельный blur живого enabled элемента, завершённый до его удаления,
1697
+ отменяет это право. Перемещение фокуса на другой owner отменяет его сразу,
1698
+ включая последующий blur этого owner. Consumer не подавляет blur/removal
1699
+ events и не управляет порядком native focus fixup.
1700
+
1701
+ Closing with `open=false` and removing an open feature form with `v-if` share
1702
+ one focus contract, including removal in the same handler that closes a nested
1703
+ or sibling confirmation. After removing the focus-owning dialog, focus returns
1704
+ to its connected, visible invoker if allowed by the current modal boundary.
1705
+ Consumers need no separate close acknowledgement or DOM `focus()`/`nextTick()`
1706
+ for restoration. A new overlay or explicit focus move cancels pending
1707
+ restoration. Retained dock hiding and error cleanup do not restore focus to a
1708
+ hidden or inert invoker.
1709
+
1710
+ A retained dialog preserves focus return after a focused action is removed
1711
+ or disabled during asynchronous work. Native focus loss is evaluated after
1712
+ the DOM update: focus remains on BODY and the observed descendant is removed
1713
+ or loses its native focus capability. A separate blur of a live enabled
1714
+ element, completed before removal, cancels this ownership. Moving focus to
1715
+ another owner cancels it immediately, including a later blur of that owner.
1716
+ Consumers do not suppress blur/removal events or manage native focus-fixup order.
1717
+
1434
1718
  ```vue
1435
1719
  <SModal v-model:open="open" title="Исходный текст" @opened="textarea?.selectAll()">
1436
1720
  <STextarea ref="textarea" :model-value="source" label="Текст" readonly />
@@ -1593,6 +1877,18 @@ typography plugin bundled in the package. Consumers do not need to install
1593
1877
  `@tailwindcss/typography` or override its transitive dependencies. The included
1594
1878
  module licenses are provided in `dist/typography.LICENSE.txt`.
1595
1879
 
1880
+ `dist/typography.js` — build-time Node ESM plugin. Он использует native
1881
+ `node:util`, сохраняет upstream options API `className`/`target` для
1882
+ `modern` и `legacy`, полный prose handler и theme. Импорты
1883
+ `tailwind.css`/`reference.css` не требуют browser Web Storage, DOM globals
1884
+ или дополнительных Node flags в consumer build.
1885
+
1886
+ `dist/typography.js` is a build-time Node ESM plugin. It uses native
1887
+ `node:util` and retains the upstream `className`/`target` options for
1888
+ `modern` and `legacy`, the complete prose handler, and theme. Building
1889
+ `tailwind.css`/`reference.css` needs neither browser Web Storage nor
1890
+ DOM globals or additional Node flags.
1891
+
1596
1892
  Для token-only интеграции доступен отдельный entrypoint:
1597
1893
 
1598
1894
  A separate entrypoint is available for token-only integration:
@@ -1633,8 +1929,12 @@ Components consume semantic custom properties. Consumers override documented
1633
1929
  tokens on the root theme container and do not depend on internal CSS classes or
1634
1930
  template structure.
1635
1931
 
1636
- Floating surfaces teleport to `document.body`; toast, drag fallbacks, modal, and
1637
- drawer also use root-level bands. The values `--s-layer-floating`,
1932
+ Unscoped floating surfaces teleport to `document.body`. Floating descendants of
1933
+ a viewport dialog use its untransformed portal. Native modal top-layer order
1934
+ belongs to the browser, not to a larger `z-index`. Global notifications remain
1935
+ background content during viewport modality; a modal-local notification viewport
1936
+ uses its own dialog's portal. Toast and drag root bands do not override native
1937
+ top-layer isolation. The values `--s-layer-floating`,
1638
1938
  `--s-layer-toast`, `--s-layer-drag`, and `--s-layer-overlay-backdrop` are base
1639
1939
  anchors. Registered nested layers advance by `--s-layer-overlay-step`, while a
1640
1940
  modal surface uses `--s-layer-overlay-surface-offset` above its backdrop.
@@ -1650,6 +1950,7 @@ Integrate a host overlay scale through one root offset:
1650
1950
 
1651
1951
  `--host-overlay-surface` belongs to the host application. The offset shifts all
1652
1952
  root UI-kit bands together and leaves local content/navigation anchors intact.
1953
+ It integrates ordinary host stacking contexts, not another native top layer.
1653
1954
  Do not combine it with manual shifts of individual layer tokens. The complete
1654
1955
  owner map, dynamic-stack contract, and verification checklist are published in
1655
1956
  `docs/theming.md` inside the npm package.
@@ -1793,16 +2094,33 @@ local DOM listeners or CSS.
1793
2094
 
1794
2095
  ## Версии / Versioning
1795
2096
 
1796
- Пакет следует Semantic Versioning:
2097
+ Пакет следует [Semantic Versioning](https://semver.org/). В серии `0.x`
2098
+ контракт развивается по явной политике:
2099
+
2100
+ The package follows [Semantic Versioning](https://semver.org/). The `0.x` series
2101
+ uses an explicit development policy:
2102
+
2103
+ - `0.y.patch` сохраняет документированный public API;
2104
+ `0.y.patch` preserves the documented public API;
2105
+ - `0.minor.0` может расширять API или требовать явно описанной миграции.
2106
+ Затронутая поверхность и действия consumer фиксируются в release notes и guide;
2107
+ `0.minor.0` may extend the API or require an explicitly documented migration.
2108
+ Release notes and a guide identify the affected surface and consumer actions.
2109
+
2110
+ Обновление между minor-сериями `0.x` требует чтения migration notes и проверки
2111
+ своей композиции; один только minor номер не обещает отсутствие миграции.
2112
+
2113
+ Upgrading between `0.x` minor series requires reviewing migration notes and
2114
+ verifying the consumer composition; a minor number alone does not guarantee a
2115
+ migration-free upgrade.
1797
2116
 
1798
- The package follows Semantic Versioning:
2117
+ Начиная с `1.0.0` действует стабильный public API: `patch` — совместимое
2118
+ исправление, `minor` — совместимое расширение, `major` — несовместимое изменение
2119
+ exports, props, events, tokens или поведения.
1799
2120
 
1800
- - `patch` — исправление с сохранением документированного контракта;
1801
- a fix that preserves the documented contract;
1802
- - `minor` — обратно совместимое расширение public API;
1803
- a backward-compatible public API extension;
1804
- - `major` — несовместимое изменение exports, props, events, tokens или поведения;
1805
- an incompatible change to exports, props, events, tokens, or behavior.
2121
+ From `1.0.0`, the public API is stable: `patch` is a compatible fix, `minor` is
2122
+ a compatible extension, and `major` is an incompatible change to exports,
2123
+ props, events, tokens, or behavior.
1806
2124
 
1807
2125
  Один и тот же номер версии не публикуется повторно.
1808
2126
 
@@ -1 +1 @@
1
- .s-resize-handle[data-orientation=vertical][data-hitbox=compact][data-v-13b9b27a]{width:var(--s-resize-handle-hitbox-compact)}.s-resize-handle[data-orientation=vertical][data-hitbox=standard][data-v-13b9b27a]{width:var(--s-resize-handle-hitbox-standard)}.s-resize-handle[data-orientation=vertical][data-hitbox=spacious][data-v-13b9b27a]{width:var(--s-resize-handle-hitbox-spacious)}.s-resize-handle[data-orientation=horizontal][data-hitbox=compact][data-v-13b9b27a]{height:var(--s-resize-handle-hitbox-compact)}.s-resize-handle[data-orientation=horizontal][data-hitbox=standard][data-v-13b9b27a]{height:var(--s-resize-handle-hitbox-standard)}.s-resize-handle[data-orientation=horizontal][data-hitbox=spacious][data-v-13b9b27a]{height:var(--s-resize-handle-hitbox-spacious)}.s-resize-handle[data-v-13b9b27a]:focus-visible{outline:var(--s-focus-ring-width) solid var(--s-focus-ring-color);outline-offset:var(--s-focus-ring-offset)}
1
+ .s-resize-handle[data-orientation=vertical][data-hitbox=compact][data-v-dc65aba1]{width:var(--s-resize-handle-hitbox-compact)}.s-resize-handle[data-orientation=vertical][data-hitbox=standard][data-v-dc65aba1]{width:var(--s-resize-handle-hitbox-standard)}.s-resize-handle[data-orientation=vertical][data-hitbox=spacious][data-v-dc65aba1]{width:var(--s-resize-handle-hitbox-spacious)}.s-resize-handle[data-orientation=horizontal][data-hitbox=compact][data-v-dc65aba1]{height:var(--s-resize-handle-hitbox-compact)}.s-resize-handle[data-orientation=horizontal][data-hitbox=standard][data-v-dc65aba1]{height:var(--s-resize-handle-hitbox-standard)}.s-resize-handle[data-orientation=horizontal][data-hitbox=spacious][data-v-dc65aba1]{height:var(--s-resize-handle-hitbox-spacious)}.s-resize-handle[data-v-dc65aba1]:focus-visible{outline:var(--s-focus-ring-width) solid var(--s-focus-ring-color);outline-offset:var(--s-focus-ring-offset)}
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){[data-v-a108e8f1],[data-v-a108e8f1]:before,[data-v-a108e8f1]:after,[data-v-a108e8f1]::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial}}}.s-dialog-surface[data-v-a108e8f1]{width:100%;max-width:none;height:100%;max-height:none;color:inherit;box-shadow:none;background:0 0;border:0;margin:0;padding:0;position:absolute;inset:0;overflow:visible}dialog.s-dialog-surface[data-v-a108e8f1]{display:block;position:fixed}dialog.s-dialog-surface[data-v-a108e8f1]::backdrop{pointer-events:none;background:0 0}.s-dialog-surface__portal[data-v-a108e8f1]{display:contents}.s-dialog-surface__frame[data-v-a108e8f1]{box-shadow:var(--s-elevation-overlay)}.s-dialog-surface[data-v-a108e8f1]:focus-visible{outline:none}.s-dialog-surface:focus-visible .s-dialog-surface__frame[data-v-a108e8f1]{outline:var(--s-focus-ring-width) solid var(--s-focus-ring-color);outline-offset:var(--s-focus-ring-inset-offset)}.s-modal-backdrop[data-v-a108e8f1],.s-drawer-backdrop[data-v-a108e8f1]{background:var(--s-overlay-backdrop-surface);-webkit-backdrop-filter:blur(var(--s-overlay-backdrop-blur));backdrop-filter:blur(var(--s-overlay-backdrop-blur));position:absolute;inset:0}.s-modal-container[data-v-a108e8f1],.s-drawer-shell[data-v-a108e8f1]{position:absolute;inset:0}.s-modal-container[data-v-a108e8f1]{overflow-y:auto}.s-drawer-backdrop[data-scope=contained][data-v-a108e8f1],.s-drawer-shell[data-scope=contained][data-v-a108e8f1]{pointer-events:auto}.s-modal-panel-container[data-v-a108e8f1]{min-height:100%;padding:calc(var(--spacing,.25rem) * 4);text-align:center;justify-content:center;align-items:center;display:flex}.s-modal-panel-container--fullscreen[data-v-a108e8f1]{text-align:left;justify-content:stretch;align-items:stretch;padding:0}.s-drawer-positioner[data-v-a108e8f1]{justify-content:right;align-items:stretch;display:flex;position:absolute;inset:0}.s-drawer-positioner[data-placement=left][data-v-a108e8f1]{justify-content:left}.s-drawer-positioner[data-placement=bottom][data-v-a108e8f1]{justify-content:stretch;align-items:flex-end}.s-dialog-surface__frame[data-presentation=modal][data-v-a108e8f1]{width:100%;transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);border-radius:var(--radius-2xl,1rem);padding:calc(var(--spacing,.25rem) * 6);text-align:left;vertical-align:middle;background-color:var(--color-surface-0,#fff);overflow:hidden}.s-dialog-surface__frame[data-presentation=modal][data-v-a108e8f1]:where(.dark,.dark *){background-color:var(--color-surface-800,#1e293b)}.s-dialog-surface__frame[data-presentation=modal][data-surface=subtle][data-v-a108e8f1]{background-color:var(--color-surface-50,#f8fafc)}.s-dialog-surface__frame[data-presentation=modal][data-surface=subtle][data-v-a108e8f1]:where(.dark,.dark *){background-color:var(--color-surface-900,#0f172a)}.s-dialog-surface__frame[data-presentation=modal][data-scroll=body][data-v-a108e8f1]{flex-direction:column;max-height:calc(100dvh - 2rem);display:flex}.s-dialog-surface__frame[data-presentation=modal][data-scroll=body] .s-dialog-surface__body[data-v-a108e8f1]{flex:1;min-height:0;overflow-y:auto}.s-dialog-surface__frame[data-presentation=modal][data-layout=fullscreen][data-v-a108e8f1]{border-radius:0;max-width:100%;height:100%;min-height:100vh}.s-dialog-surface__frame[data-presentation=modal][data-size=sm][data-v-a108e8f1]{max-width:24rem}.s-dialog-surface__frame[data-presentation=modal][data-size=md][data-v-a108e8f1]{max-width:28rem}.s-dialog-surface__frame[data-presentation=modal][data-size=lg][data-v-a108e8f1]{max-width:32rem}.s-dialog-surface__frame[data-presentation=modal][data-size=xl][data-v-a108e8f1]{max-width:36rem}.s-dialog-surface__frame[data-presentation=modal][data-size="2xl"][data-v-a108e8f1]{max-width:42rem}.s-dialog-surface__frame[data-presentation=modal][data-size="3xl"][data-v-a108e8f1]{max-width:48rem}.s-dialog-surface__frame[data-presentation=modal][data-size="4xl"][data-v-a108e8f1]{max-width:56rem}.s-dialog-surface__frame[data-presentation=modal][data-size=wide][data-v-a108e8f1]{max-width:72rem}.s-dialog-surface__frame[data-presentation=modal] .s-dialog-surface__header[data-v-a108e8f1]{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-surface-200,#e2e8f0);padding-bottom:calc(var(--spacing,.25rem) * 4);justify-content:space-between;align-items:flex-start;display:flex}.s-dialog-surface__frame[data-presentation=modal] .s-dialog-surface__header[data-v-a108e8f1]:where(.dark,.dark *){border-color:var(--color-surface-700,#334155)}.s-dialog-surface__frame[data-presentation=modal] .s-dialog-surface__title[data-v-a108e8f1]{font-size:var(--text-lg,1.125rem);line-height:var(--tw-leading,var(--text-lg--line-height,calc(1.75 / 1.125)));--tw-leading:calc(var(--spacing,.25rem) * 6);line-height:calc(var(--spacing,.25rem) * 6);--tw-font-weight:var(--font-weight-medium,500);font-weight:var(--font-weight-medium,500);color:var(--color-surface-900,#0f172a)}.s-dialog-surface__frame[data-presentation=modal] .s-dialog-surface__title[data-v-a108e8f1]:where(.dark,.dark *){color:var(--color-surface-100,#f1f5f9)}.s-dialog-surface__frame[data-presentation=modal] .s-dialog-surface__body[data-v-a108e8f1]{margin-top:calc(var(--spacing,.25rem) * 4);font-size:var(--text-sm,.875rem);line-height:var(--tw-leading,var(--text-sm--line-height,calc(1.25 / .875)));color:var(--color-surface-600,#475569)}.s-dialog-surface__frame[data-presentation=modal] .s-dialog-surface__body[data-v-a108e8f1]:where(.dark,.dark *){color:var(--color-surface-300,#cbd5e1)}.s-dialog-surface__frame[data-presentation=modal] .s-dialog-surface__footer[data-v-a108e8f1]{margin-top:calc(var(--spacing,.25rem) * 6);justify-content:flex-end;gap:calc(var(--spacing,.25rem) * 3);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--color-surface-200,#e2e8f0);padding-top:calc(var(--spacing,.25rem) * 4);display:flex}.s-dialog-surface__frame[data-presentation=modal] .s-dialog-surface__footer[data-v-a108e8f1]:where(.dark,.dark *){border-color:var(--color-surface-700,#334155)}.s-dialog-surface__frame[data-presentation=modal] .s-dialog-surface__footer[data-layout=split][data-v-a108e8f1]{justify-content:flex-start;align-items:center;column-gap:calc(var(--spacing,.25rem) * 3);row-gap:calc(var(--spacing,.25rem) * 2);flex-wrap:wrap}.s-dialog-surface__footer-start[data-v-a108e8f1],.s-dialog-surface__footer-end[data-v-a108e8f1]{align-items:center;gap:calc(var(--spacing,.25rem) * 2);flex-wrap:wrap;min-width:0;display:flex}.s-dialog-surface__footer-start[data-v-a108e8f1]{margin-right:auto}.s-dialog-surface__footer-end[data-v-a108e8f1]{justify-content:flex-end;margin-left:auto}.s-dialog-surface__frame[data-presentation=drawer][data-v-a108e8f1]{border-left-style:var(--tw-border-style);border-left-width:1px;border-color:var(--color-surface-200,#e2e8f0);background-color:var(--color-surface-0,#fff);width:100%;height:100%;color:var(--color-surface-900,#0f172a);flex-direction:column;display:flex;position:relative;overflow:hidden}.s-dialog-surface__frame[data-presentation=drawer][data-v-a108e8f1]:where(.dark,.dark *){border-color:var(--color-surface-700,#334155);background-color:var(--color-surface-900,#0f172a);color:var(--color-surface-0,#fff)}.s-dialog-surface__frame[data-presentation=drawer][data-placement=left][data-v-a108e8f1]{border-right-style:var(--tw-border-style);border-right-width:1px;border-left-style:var(--tw-border-style);border-left-width:0}.s-dialog-surface__frame[data-presentation=drawer][data-size=sm][data-v-a108e8f1]{max-width:30rem}.s-dialog-surface__frame[data-presentation=drawer][data-size=md][data-v-a108e8f1]{max-width:36rem}.s-dialog-surface__frame[data-presentation=drawer][data-size=lg][data-v-a108e8f1]{max-width:44rem}.s-dialog-surface__frame[data-presentation=drawer][data-placement=bottom][data-v-a108e8f1]{border-top-left-radius:var(--radius-2xl,1rem);border-top-right-radius:var(--radius-2xl,1rem);border-top-style:var(--tw-border-style);border-top-width:1px;border-left-style:var(--tw-border-style);border-left-width:0;border-color:var(--color-surface-200,#e2e8f0);max-width:none}.s-dialog-surface__frame[data-presentation=drawer][data-placement=bottom][data-v-a108e8f1]:where(.dark,.dark *){border-color:var(--color-surface-700,#334155)}.s-dialog-surface__frame[data-presentation=drawer][data-placement=bottom][data-v-a108e8f1]{width:100%}.s-dialog-surface__frame[data-presentation=drawer][data-scope=viewport][data-placement=bottom][data-v-a108e8f1]{max-height:calc(100dvh - 1rem)}.s-dialog-surface__frame[data-presentation=drawer][data-scope=viewport][data-placement=bottom][data-size=sm][data-v-a108e8f1]{height:50dvh}.s-dialog-surface__frame[data-presentation=drawer][data-scope=viewport][data-placement=bottom][data-size=md][data-v-a108e8f1]{height:70dvh}.s-dialog-surface__frame[data-presentation=drawer][data-scope=viewport][data-placement=bottom][data-size=lg][data-v-a108e8f1]{height:90dvh}.s-dialog-surface__frame[data-presentation=drawer][data-scope=contained][data-v-a108e8f1]{min-block-size:0;max-block-size:100%;min-inline-size:0;max-inline-size:none}.s-dialog-surface__frame[data-presentation=drawer][data-scope=contained][data-placement=bottom][data-v-a108e8f1]{block-size:var(--s-drawer-extent)}.s-dialog-surface__frame[data-presentation=drawer][data-scope=contained][data-placement=left][data-v-a108e8f1],.s-dialog-surface__frame[data-presentation=drawer][data-scope=contained][data-placement=right][data-v-a108e8f1]{inline-size:var(--s-drawer-extent)}.s-dialog-surface__frame[data-presentation=drawer] .s-dialog-surface__header[data-v-a108e8f1]{align-items:flex-start;gap:calc(var(--spacing,.25rem) * 3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-surface-200,#e2e8f0);padding-inline:calc(var(--spacing,.25rem) * 5);padding-block:calc(var(--spacing,.25rem) * 4);flex-shrink:0;display:flex}@media (width>=48rem){.s-dialog-surface__frame[data-presentation=drawer] .s-dialog-surface__header[data-v-a108e8f1]{padding-inline:calc(var(--spacing,.25rem) * 6)}}.s-dialog-surface__frame[data-presentation=drawer] .s-dialog-surface__header[data-v-a108e8f1]:where(.dark,.dark *){border-color:var(--color-surface-700,#334155)}.s-dialog-surface__frame[data-presentation=drawer] .s-dialog-surface__title[data-v-a108e8f1]{min-width:0;font-size:var(--text-lg,1.125rem);line-height:var(--tw-leading,var(--text-lg--line-height,calc(1.75 / 1.125)));--tw-leading:calc(var(--spacing,.25rem) * 6);line-height:calc(var(--spacing,.25rem) * 6);--tw-font-weight:var(--font-weight-semibold,600);font-weight:var(--font-weight-semibold,600);color:var(--color-surface-950,#020617);flex:1}.s-dialog-surface__frame[data-presentation=drawer] .s-dialog-surface__title[data-v-a108e8f1]:where(.dark,.dark *){color:var(--color-surface-0,#fff)}.s-dialog-surface__frame[data-presentation=drawer] .s-dialog-surface__body[data-v-a108e8f1]{min-width:0;min-height:0;padding:calc(var(--spacing,.25rem) * 5);flex:1;overflow-y:auto}@media (width>=48rem){.s-dialog-surface__frame[data-presentation=drawer] .s-dialog-surface__body[data-v-a108e8f1]{padding:calc(var(--spacing,.25rem) * 6)}}.s-dialog-surface__frame[data-presentation=drawer] .s-dialog-surface__body[data-v-a108e8f1]{overscroll-behavior:contain}.s-dialog-surface__frame[data-presentation=drawer][data-scroll=content] .s-dialog-surface__body[data-v-a108e8f1]{flex-direction:column;padding:0;display:flex;overflow:hidden}.s-dialog-surface__frame[data-presentation=drawer] .s-dialog-surface__footer[data-v-a108e8f1]{justify-content:flex-end;gap:calc(var(--spacing,.25rem) * 3);border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--color-surface-200,#e2e8f0);padding-inline:calc(var(--spacing,.25rem) * 5);padding-block:calc(var(--spacing,.25rem) * 4);flex-wrap:wrap;flex-shrink:0;display:flex}@media (width>=48rem){.s-dialog-surface__frame[data-presentation=drawer] .s-dialog-surface__footer[data-v-a108e8f1]{padding-inline:calc(var(--spacing,.25rem) * 6)}}.s-dialog-surface__frame[data-presentation=drawer] .s-dialog-surface__footer[data-v-a108e8f1]:where(.dark,.dark *){border-color:var(--color-surface-700,#334155)}@media (width<=767px){.s-dialog-surface__frame[data-presentation=drawer][data-layout=mobile-fullscreen][data-v-a108e8f1]{border-right-style:var(--tw-border-style);border-right-width:0;border-left-style:var(--tw-border-style);border-left-width:0;max-width:100%}}.s-dialog-surface[hidden][data-v-a108e8f1]{display:none}.s-dialog-surface-motion-enter-active .s-dialog-surface__frame[data-v-a108e8f1],.s-dialog-surface-motion-leave-active .s-dialog-surface__frame[data-v-a108e8f1]{transition:transform var(--s-motion-standard) ease}.s-dialog-surface-motion-enter-from[data-presentation=modal] .s-dialog-surface__frame[data-v-a108e8f1],.s-dialog-surface-motion-leave-to[data-presentation=modal] .s-dialog-surface__frame[data-v-a108e8f1]{transform:scale(.96)}.s-dialog-surface-motion-enter-from[data-presentation=drawer] .s-dialog-surface__frame[data-v-a108e8f1],.s-dialog-surface-motion-leave-to[data-presentation=drawer] .s-dialog-surface__frame[data-v-a108e8f1]{transform:translate(1.5rem)}.s-dialog-surface-motion-enter-from[data-placement=left] .s-dialog-surface__frame[data-v-a108e8f1],.s-dialog-surface-motion-leave-to[data-placement=left] .s-dialog-surface__frame[data-v-a108e8f1]{transform:translate(-1.5rem)}.s-dialog-surface-motion-enter-from[data-placement=bottom] .s-dialog-surface__frame[data-v-a108e8f1],.s-dialog-surface-motion-leave-to[data-placement=bottom] .s-dialog-surface__frame[data-v-a108e8f1]{transform:translateY(1.5rem)}@media (width<=767px){.s-dialog-surface-motion-enter-from[data-placement=right] .s-dialog-surface__frame[data-v-a108e8f1],.s-dialog-surface-motion-leave-to[data-placement=right] .s-dialog-surface__frame[data-v-a108e8f1]{transform:translateY(1.5rem)}}.s-dialog-surface-motion-enter-active .s-modal-backdrop[data-v-a108e8f1],.s-dialog-surface-motion-leave-active .s-modal-backdrop[data-v-a108e8f1],.s-dialog-surface-motion-enter-active .s-drawer-backdrop[data-v-a108e8f1],.s-dialog-surface-motion-leave-active .s-drawer-backdrop[data-v-a108e8f1]{transition:opacity var(--s-motion-standard) ease}.s-dialog-surface-motion-enter-from .s-modal-backdrop[data-v-a108e8f1],.s-dialog-surface-motion-leave-to .s-modal-backdrop[data-v-a108e8f1],.s-dialog-surface-motion-enter-from .s-drawer-backdrop[data-v-a108e8f1],.s-dialog-surface-motion-leave-to .s-drawer-backdrop[data-v-a108e8f1]{opacity:0}@media (prefers-reduced-motion:reduce){.s-dialog-surface-motion-enter-active .s-dialog-surface__frame[data-v-a108e8f1],.s-dialog-surface-motion-leave-active .s-dialog-surface__frame[data-v-a108e8f1],.s-dialog-surface-motion-enter-active .s-modal-backdrop[data-v-a108e8f1],.s-dialog-surface-motion-leave-active .s-modal-backdrop[data-v-a108e8f1],.s-dialog-surface-motion-enter-active .s-drawer-backdrop[data-v-a108e8f1],.s-dialog-surface-motion-leave-active .s-drawer-backdrop[data-v-a108e8f1]{transition:none}.s-dialog-surface-motion-enter-from[data-presentation=modal] .s-dialog-surface__frame[data-v-a108e8f1],.s-dialog-surface-motion-leave-to[data-presentation=modal] .s-dialog-surface__frame[data-v-a108e8f1],.s-dialog-surface-motion-enter-from[data-presentation=drawer] .s-dialog-surface__frame[data-v-a108e8f1],.s-dialog-surface-motion-leave-to[data-presentation=drawer] .s-dialog-surface__frame[data-v-a108e8f1],.s-dialog-surface-motion-enter-from[data-placement] .s-dialog-surface__frame[data-v-a108e8f1],.s-dialog-surface-motion-leave-to[data-placement] .s-dialog-surface__frame[data-v-a108e8f1]{transform:none}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){[data-v-71824088],[data-v-71824088]:before,[data-v-71824088]:after,[data-v-71824088]::backdrop{--tw-border-style:solid}}}.s-collapsible-panel[data-v-71824088]{z-index:0;border-radius:var(--radius-lg,1rem);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-surface-200,#e2e8f0);background-color:var(--color-surface-0,#fff);flex-direction:column;flex:none;width:100%;min-width:0;min-height:0;display:flex;position:relative;overflow:hidden}.s-collapsible-panel[data-v-71824088]:where(.dark,.dark *){border-color:var(--color-surface-700,#334155);background-color:var(--color-surface-800,#1e293b)}.s-collapsible-panel[data-surface=plain][data-v-71824088]{border-style:var(--tw-border-style);background-color:#0000;border-width:0;border-radius:0}.s-collapsible-panel[data-surface=plain][data-v-71824088]:where(.dark,.dark *){background-color:#0000}.s-collapsible-panel-header[data-v-71824088]{align-items:center;gap:var(--spacing,.25rem);flex-shrink:0;min-width:0;display:flex}.s-collapsible-panel-trigger[data-v-71824088]{flex:1;min-width:0}.s-collapsible-panel-actions[data-v-71824088]{align-items:center;gap:var(--spacing,.25rem);padding-right:var(--spacing,.25rem);flex-shrink:0;display:flex}.s-collapsible-panel-content[data-v-71824088]{background:inherit;width:100%;min-width:0;transition:max-height var(--s-motion-standard) ease;will-change:max-height;max-height:0;overflow:hidden}.s-collapsible-panel-content.is-opened[data-v-71824088]{max-height:none;transition:none;overflow-y:visible}.s-collapsible-panel-inner[data-v-71824088]{padding:calc(var(--spacing,.25rem) * 4);font-size:var(--text-sm,.875rem);line-height:var(--tw-leading,var(--text-sm--line-height,calc(1.25 / .875)));color:var(--color-surface-600,#475569)}.s-collapsible-panel-inner[data-v-71824088]:where(.dark,.dark *){color:var(--color-surface-300,#cbd5e1)}.s-collapsible-panel-content.is-animating[data-v-71824088]{border-color:#0000}.s-collapsible-panel[data-density=compact] .s-collapsible-panel-inner[data-v-71824088]{padding:calc(var(--spacing,.25rem) * 3)}.s-collapsible-panel[data-density=dense] .s-collapsible-panel-inner[data-v-71824088]{padding:calc(var(--spacing,.25rem) * 2);font-size:var(--text-xs,.75rem);line-height:var(--tw-leading,var(--text-xs--line-height,calc(1 / .75)))}.s-collapsible-panel[data-content-padding=none]>.s-collapsible-panel-content>.s-collapsible-panel-inner[data-v-71824088]{padding:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){[data-v-db85261d],[data-v-db85261d]:before,[data-v-db85261d]:after,[data-v-db85261d]::backdrop{--tw-border-style:solid}}}.s-collapsible-panel[data-v-db85261d]{z-index:0;border-radius:var(--radius-lg,1rem);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-surface-200,#e2e8f0);background-color:var(--color-surface-0,#fff);flex-direction:column;flex:none;width:100%;min-width:0;min-height:0;display:flex;position:relative;overflow:hidden}.s-collapsible-panel[data-v-db85261d]:where(.dark,.dark *){border-color:var(--color-surface-700,#334155);background-color:var(--color-surface-800,#1e293b)}.s-collapsible-panel[data-surface=plain][data-v-db85261d]{border-style:var(--tw-border-style);background-color:#0000;border-width:0;border-radius:0}.s-collapsible-panel[data-surface=plain][data-v-db85261d]:where(.dark,.dark *){background-color:#0000}.s-collapsible-panel-header[data-v-db85261d]{align-items:center;gap:var(--spacing,.25rem);flex-shrink:0;min-width:0;display:flex}.s-collapsible-panel-trigger[data-v-db85261d]{flex:1;min-width:0}.s-collapsible-panel-actions[data-v-db85261d]{align-items:center;gap:var(--spacing,.25rem);padding-right:var(--spacing,.25rem);flex-shrink:0;display:flex}.s-collapsible-panel-content[data-v-db85261d]{background:inherit;width:100%;min-width:0;transition:max-height var(--s-motion-standard) ease;will-change:max-height;max-height:0;overflow:hidden}.s-collapsible-panel-content.is-opened[data-v-db85261d]{max-height:none;transition:none;overflow-y:visible}.s-collapsible-panel-inner[data-v-db85261d]{padding:calc(var(--spacing,.25rem) * 4);font-size:var(--text-sm,.875rem);line-height:var(--tw-leading,var(--text-sm--line-height,calc(1.25 / .875)));color:var(--color-surface-600,#475569)}.s-collapsible-panel-inner[data-v-db85261d]:where(.dark,.dark *){color:var(--color-surface-300,#cbd5e1)}.s-collapsible-panel-content.is-animating[data-v-db85261d]{border-color:#0000}.s-collapsible-panel[data-density=compact] .s-collapsible-panel-inner[data-v-db85261d]{padding:calc(var(--spacing,.25rem) * 3)}.s-collapsible-panel[data-density=dense] .s-collapsible-panel-inner[data-v-db85261d]{padding:calc(var(--spacing,.25rem) * 2);font-size:var(--text-xs,.75rem);line-height:var(--tw-leading,var(--text-xs--line-height,calc(1 / .75)))}.s-collapsible-panel[data-content-padding=none]>.s-collapsible-panel-content>.s-collapsible-panel-inner[data-v-db85261d]{padding:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
- .s-overlay-host[data-v-8f9be94e]{isolation:isolate;flex-direction:column;flex:1;min-width:0;height:100%;min-height:0;display:flex;position:relative;overflow:hidden}.s-overlay-host__content[data-v-8f9be94e]{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.s-overlay-host__portal[data-v-8f9be94e]{pointer-events:none;position:absolute;inset:0}
2
+ .s-overlay-host[data-v-09215628]{isolation:isolate;flex-direction:column;flex:1;min-width:0;height:100%;min-height:0;display:flex;position:relative;overflow:hidden}.s-overlay-host__content[data-v-09215628]{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.s-overlay-host__portal[data-v-09215628]{pointer-events:none;position:absolute;inset:0}
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){[data-v-4091d007],[data-v-4091d007]:before,[data-v-4091d007]:after,[data-v-4091d007]::backdrop{--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}.s-popover-wrapper[data-v-4091d007]{position:relative}.s-popover-panel[data-v-4091d007]{display:inline-block}.s-popover-content[data-v-4091d007]{border-radius:var(--radius-lg,1rem);text-align:left;background:var(--s-floating-surface);color:var(--s-floating-foreground);box-shadow:0 0 0 1px var(--s-floating-outline), var(--s-elevation-floating);display:block}.s-popover-panel[data-width=sm][data-v-4091d007]{width:min(20rem,100vw - 1rem)}.s-popover-panel[data-width=md][data-v-4091d007]{width:min(28rem,100vw - 1rem)}.s-popover-panel[data-width=lg][data-v-4091d007]{width:min(36rem,100vw - 1rem)}.s-popover-panel[data-surface=transparent][data-v-4091d007]{max-width:90vw}.s-popover-panel[data-surface=transparent] .s-popover-content[data-v-4091d007]{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);background-color:#0000}.s-popover-panel[data-surface=transparent] .s-popover-content[data-v-4091d007]:where(.dark,.dark *){background-color:#0000}.s-popover-panel[data-surface=transparent] .s-popover-content[data-v-4091d007]{box-shadow:none}.s-popover-panel[hidden][data-v-4091d007]{display:none}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){[data-v-a4f1f64a],[data-v-a4f1f64a]:before,[data-v-a4f1f64a]:after,[data-v-a4f1f64a]::backdrop{--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}.s-popover-wrapper[data-v-a4f1f64a]{position:relative}.s-popover-panel[data-v-a4f1f64a]{display:inline-block}.s-popover-content[data-v-a4f1f64a]{border-radius:var(--radius-lg,1rem);text-align:left;background:var(--s-floating-surface);color:var(--s-floating-foreground);box-shadow:0 0 0 1px var(--s-floating-outline), var(--s-elevation-floating);display:block}.s-popover-panel[data-width=sm][data-v-a4f1f64a]{width:min(20rem,100vw - 1rem)}.s-popover-panel[data-width=md][data-v-a4f1f64a]{width:min(28rem,100vw - 1rem)}.s-popover-panel[data-width=lg][data-v-a4f1f64a]{width:min(36rem,100vw - 1rem)}.s-popover-panel[data-surface=transparent][data-v-a4f1f64a]{max-width:90vw}.s-popover-panel[data-surface=transparent] .s-popover-content[data-v-a4f1f64a]{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);background-color:#0000}.s-popover-panel[data-surface=transparent] .s-popover-content[data-v-a4f1f64a]:where(.dark,.dark *){background-color:#0000}.s-popover-panel[data-surface=transparent] .s-popover-content[data-v-a4f1f64a]{box-shadow:none}.s-popover-panel[hidden][data-v-a4f1f64a]{display:none}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){[data-v-52396e42],[data-v-52396e42]:before,[data-v-52396e42]:after,[data-v-52396e42]::backdrop{--tw-border-style:solid}}}.s-sidebar-section-wrapper[data-v-52396e42]{flex-direction:column;min-height:0;display:flex;overflow:hidden}.s-sidebar-section[data-v-52396e42]{flex-direction:column;flex:1;width:100%;min-height:0;display:flex;overflow:hidden}.s-sidebar-section-wrapper+.s-sidebar-section-wrapper .s-sidebar-section[data-v-52396e42]{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--color-surface-200,#e2e8f0)}.s-sidebar-section-wrapper+.s-sidebar-section-wrapper .s-sidebar-section[data-v-52396e42]:where(.dark,.dark *){border-color:var(--color-surface-700,#334155)}.s-sidebar-section-wrapper--resizable-before .s-sidebar-section[data-v-52396e42]{border-top-style:var(--tw-border-style);border-top-width:0}.s-sidebar-section-header[data-v-52396e42]{height:calc(var(--spacing,.25rem) * 7);align-items:center;gap:var(--spacing,.25rem);width:100%;padding-inline:var(--spacing,.25rem);background-color:#f8fafcb3;display:flex}@supports (color:color-mix(in lab, red, red)){.s-sidebar-section-header[data-v-52396e42]{background-color:color-mix(in oklab, var(--color-surface-50,#f8fafc) 70%, transparent)}}.s-sidebar-section-header[data-v-52396e42]:where(.dark,.dark *){background-color:#1e293b8c}@supports (color:color-mix(in lab, red, red)){.s-sidebar-section-header[data-v-52396e42]:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-surface-800,#1e293b) 55%, transparent)}}.s-sidebar-section-header[data-v-52396e42]{color:var(--color-surface-600,#475569)}.s-sidebar-section-header[data-v-52396e42]:where(.dark,.dark *){color:var(--color-surface-300,#cbd5e1)}.s-sidebar-section-header[data-v-52396e42]{transition:background-color var(--s-motion-standard) ease, color var(--s-motion-standard) ease;flex-shrink:0}:is(.s-sidebar-section-header[data-v-52396e42]:has([data-sidebar-section-toggle]:hover),.s-sidebar-section-header[data-v-52396e42]:has([data-sidebar-section-toggle]:focus-visible)){background-color:var(--color-surface-100,#f1f5f9);color:var(--color-surface-800,#1e293b)}:is(.s-sidebar-section-header[data-v-52396e42]:has([data-sidebar-section-toggle]:hover),.s-sidebar-section-header[data-v-52396e42]:has([data-sidebar-section-toggle]:focus-visible)):where(.dark,.dark *){background-color:#334155b3}@supports (color:color-mix(in lab, red, red)){:is(.s-sidebar-section-header[data-v-52396e42]:has([data-sidebar-section-toggle]:hover),.s-sidebar-section-header[data-v-52396e42]:has([data-sidebar-section-toggle]:focus-visible)):where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-surface-700,#334155) 70%, transparent)}}:is(.s-sidebar-section-header[data-v-52396e42]:has([data-sidebar-section-toggle]:hover),.s-sidebar-section-header[data-v-52396e42]:has([data-sidebar-section-toggle]:focus-visible)):where(.dark,.dark *){color:var(--color-surface-100,#f1f5f9)}.s-sidebar-section-header--mobile[data-v-52396e42]{height:calc(var(--spacing,.25rem) * 6);padding-inline:calc(var(--spacing,.25rem) * 1.5)}.s-sidebar-section-trigger[data-v-52396e42]{flex:1;min-width:0}.s-sidebar-section-actions[data-v-52396e42]{align-items:center;gap:var(--spacing,.25rem);flex-shrink:0;margin-left:auto;display:flex}.s-sidebar-section-content[data-v-52396e42]{font-size:var(--text-sm,.875rem);line-height:var(--tw-leading,var(--text-sm--line-height,calc(1.25 / .875)));color:var(--color-surface-700,#334155)}.s-sidebar-section-content[data-v-52396e42]:where(.dark,.dark *){color:var(--color-surface-300,#cbd5e1)}.s-sidebar-section-content[data-v-52396e42]{flex:1;min-height:0;overflow:hidden auto}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}