@poveste/app 0.14.0 → 0.16.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 (126) hide show
  1. package/dist/app/style/main.pcss +18 -44
  2. package/dist/bundled/App.vue_vue_type_script_setup_true_lang.js +9 -7
  3. package/dist/bundled/app.css +91 -28
  4. package/dist/bundled/components/app/AppActions.vue_vue_type_script_setup_true_lang.js +44 -27
  5. package/dist/bundled/components/app/ShortcutTooltip.js +5 -0
  6. package/dist/bundled/components/app/ShortcutTooltip.vue_vue_type_script_setup_true_lang.js +27 -0
  7. package/dist/bundled/components/app/TopBarChipItem.js +1 -1
  8. package/dist/bundled/components/base/BaseDropdown.js +6 -0
  9. package/dist/bundled/components/base/BaseDropdown.vue_vue_type_script_setup_true_lang.js +68 -0
  10. package/dist/bundled/components/base/BaseEmpty.js +2 -2
  11. package/dist/bundled/components/base/BaseOverflowMenu.vue_vue_type_script_setup_true_lang.js +19 -19
  12. package/dist/bundled/components/base/BaseSelect.js +1 -0
  13. package/dist/bundled/components/base/BaseSelect.vue_vue_type_script_setup_true_lang.js +194 -33
  14. package/dist/bundled/components/base/BaseSplitPane.js +1 -1
  15. package/dist/bundled/components/base/BaseSplitPane.vue_vue_type_script_setup_true_lang.js +65 -4
  16. package/dist/bundled/components/command/PromptSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  17. package/dist/bundled/components/panel/ControlsComponentPropItem.vue_vue_type_script_setup_true_lang.js +24 -16
  18. package/dist/bundled/components/panel/ControlsComponentProps.vue_vue_type_script_setup_true_lang.js +9 -6
  19. package/dist/bundled/components/panel/ControlsComponentState.vue_vue_type_script_setup_true_lang.js +9 -6
  20. package/dist/bundled/components/panel/PaneTabs.vue_vue_type_script_setup_true_lang.js +6 -6
  21. package/dist/bundled/components/panel/StatePresets.vue_vue_type_script_setup_true_lang.js +96 -52
  22. package/dist/bundled/components/panel/StoryEvent.vue_vue_type_script_setup_true_lang.js +5 -5
  23. package/dist/bundled/components/panel/StorySidePanel.vue_vue_type_script_setup_true_lang.js +2 -1
  24. package/dist/bundled/components/panel/StorySourceCode.js +1 -1
  25. package/dist/bundled/components/panel/StorySourceCode.vue_vue_type_script_setup_true_lang.js +24 -18
  26. package/dist/bundled/components/search/SearchItemContent.vue_vue_type_script_setup_true_lang.js +2 -1
  27. package/dist/bundled/components/search/SearchPane.vue_vue_type_script_setup_true_lang.js +1 -2
  28. package/dist/bundled/components/story/StoryResponsivePreview.js +1 -1
  29. package/dist/bundled/components/story/StoryResponsivePreview.vue_vue_type_script_setup_true_lang.js +52 -45
  30. package/dist/bundled/components/story/StoryVariantGridItem.js +1 -1
  31. package/dist/bundled/components/story/StoryVariantGridItem.vue_vue_type_script_setup_true_lang.js +22 -20
  32. package/dist/bundled/components/story/StoryVariantSingle.js +1 -1
  33. package/dist/bundled/components/story/StoryVariantSingle.vue_vue_type_script_setup_true_lang.js +2 -1
  34. package/dist/bundled/components/story/StoryVariantSinglePreviewRemote.vue_vue_type_script_setup_true_lang.js +9 -6
  35. package/dist/bundled/components/story/StoryView.vue_vue_type_script_setup_true_lang.js +5 -1
  36. package/dist/bundled/components/toolbar/DevOnlyToolbarOpenInEditor.vue_vue_type_script_setup_true_lang.js +15 -12
  37. package/dist/bundled/components/toolbar/ToolbarBackground.vue_vue_type_script_setup_true_lang.js +20 -16
  38. package/dist/bundled/components/toolbar/ToolbarNewTab.vue_vue_type_script_setup_true_lang.js +16 -13
  39. package/dist/bundled/components/toolbar/ToolbarResponsiveSize.vue_vue_type_script_setup_true_lang.js +35 -24
  40. package/dist/bundled/components/toolbar/ToolbarTextDirection.vue_vue_type_script_setup_true_lang.js +15 -12
  41. package/dist/bundled/components/toolbar/ToolbarTitle.js +1 -1
  42. package/dist/bundled/components/toolbar/ToolbarTitle.vue_vue_type_script_setup_true_lang.js +1 -1
  43. package/dist/bundled/components/tree/StoryGroup.vue_vue_type_script_setup_true_lang.js +2 -2
  44. package/dist/bundled/components/tree/StoryList.vue_vue_type_script_setup_true_lang.js +3 -3
  45. package/dist/bundled/components/tree/StoryListFolder.js +1 -1
  46. package/dist/bundled/components/tree/StoryListFolder.vue_vue_type_script_setup_true_lang.js +3 -3
  47. package/dist/bundled/components/tree/StoryListItem.js +1 -1
  48. package/dist/bundled/components/tree/StoryListItem.vue_vue_type_script_setup_true_lang.js +3 -3
  49. package/dist/bundled/index.js +0 -13
  50. package/dist/bundled/sandbox.js +5 -3
  51. package/dist/bundled/stores/story.js +2 -2
  52. package/dist/bundled/util/commands.js +1 -1
  53. package/dist/bundled/util/dark.js +1 -1
  54. package/dist/bundled/util/events.js +1 -1
  55. package/dist/bundled/util/grid-slots.js +1 -1
  56. package/dist/bundled/util/icons.generated.js +4 -2
  57. package/dist/bundled/util/keyboard.js +8 -14
  58. package/dist/bundled/util/mapping.js +2 -2
  59. package/dist/bundled/util/render-tracker.js +33 -0
  60. package/dist/bundled/util/scroll.js +26 -5
  61. package/dist/bundled/util/state.js +105 -5
  62. package/dist/bundled/util/variant.js +12 -2
  63. package/dist/style.css +753 -357
  64. package/package.json +28 -28
  65. package/src/__tests__/base-select.spec.ts +25 -0
  66. package/src/__tests__/render-tracker.spec.ts +38 -0
  67. package/src/__tests__/reset.spec.ts +53 -0
  68. package/src/__tests__/state-clone.spec.ts +55 -1
  69. package/src/__tests__/state-types.spec.ts +175 -0
  70. package/src/app/App.vue +44 -35
  71. package/src/app/components/app/AppActions.vue +42 -30
  72. package/src/app/components/app/ShortcutTooltip.vue +29 -0
  73. package/src/app/components/app/TopBarChipItem.vue +1 -1
  74. package/src/app/components/base/BaseDropdown.vue +142 -0
  75. package/src/app/components/base/BaseEmpty.vue +1 -1
  76. package/src/app/components/base/BaseListItemLink.vue +4 -2
  77. package/src/app/components/base/BaseOverflowMenu.vue +27 -21
  78. package/src/app/components/base/BaseSelect.vue +270 -41
  79. package/src/app/components/base/BaseSplitPane.vue +75 -4
  80. package/src/app/components/command/PromptSelect.vue +1 -1
  81. package/src/app/components/panel/ControlsComponentPropItem.vue +29 -17
  82. package/src/app/components/panel/ControlsComponentProps.vue +7 -5
  83. package/src/app/components/panel/ControlsComponentState.vue +7 -5
  84. package/src/app/components/panel/PaneTabs.vue +6 -6
  85. package/src/app/components/panel/StatePresets.vue +116 -74
  86. package/src/app/components/panel/StoryEvent.vue +10 -9
  87. package/src/app/components/panel/StorySidePanel.vue +2 -1
  88. package/src/app/components/panel/StorySourceCode.vue +51 -44
  89. package/src/app/components/search/SearchItemContent.vue +2 -1
  90. package/src/app/components/search/SearchPane.vue +2 -3
  91. package/src/app/components/story/StoryResponsivePreview.vue +61 -29
  92. package/src/app/components/story/StoryVariantGridItem.vue +20 -19
  93. package/src/app/components/story/StoryVariantSingle.vue +1 -0
  94. package/src/app/components/story/StoryVariantSinglePreviewRemote.vue +14 -8
  95. package/src/app/components/story/StoryView.vue +4 -1
  96. package/src/app/components/toolbar/DevOnlyToolbarOpenInEditor.vue +14 -12
  97. package/src/app/components/toolbar/ToolbarBackground.vue +22 -23
  98. package/src/app/components/toolbar/ToolbarNewTab.vue +14 -12
  99. package/src/app/components/toolbar/ToolbarResponsiveSize.vue +31 -25
  100. package/src/app/components/toolbar/ToolbarTextDirection.vue +14 -10
  101. package/src/app/components/toolbar/ToolbarTitle.vue +2 -2
  102. package/src/app/components/tree/StoryGroup.vue +2 -2
  103. package/src/app/components/tree/StoryList.vue +2 -2
  104. package/src/app/components/tree/StoryListFolder.vue +2 -2
  105. package/src/app/components/tree/StoryListItem.vue +1 -1
  106. package/src/app/index.ts +0 -17
  107. package/src/app/sandbox.ts +16 -3
  108. package/src/app/stores/story.ts +2 -2
  109. package/src/app/style/main.pcss +18 -44
  110. package/src/app/types.ts +4 -4
  111. package/src/app/util/commands.ts +1 -1
  112. package/src/app/util/dark.ts +1 -1
  113. package/src/app/util/env.ts +0 -1
  114. package/src/app/util/events.ts +6 -5
  115. package/src/app/util/grid-slots.ts +1 -1
  116. package/src/app/util/icons.generated.ts +2 -2
  117. package/src/app/util/keyboard.ts +7 -11
  118. package/src/app/util/mapping.ts +2 -2
  119. package/src/app/util/render-tracker.ts +31 -0
  120. package/src/app/util/scroll.ts +47 -9
  121. package/src/app/util/state.ts +141 -8
  122. package/src/app/util/variant.ts +12 -2
  123. package/dist/app/style/floating.pcss +0 -40
  124. package/dist/bundled/util/tooltip.js +0 -14
  125. package/src/app/style/floating.pcss +0 -40
  126. package/src/app/util/tooltip.ts +0 -13
@@ -1,9 +1,11 @@
1
1
  <script lang="ts" setup>
2
2
  import { Icon } from '@iconify/vue'
3
+ import { HstTooltip } from '@poveste/controls'
3
4
  import { computed } from 'vue'
4
5
  import { usePreviewSettingsStore } from '../../stores/preview-settings'
5
6
  import { povesteConfig } from '../../util/config'
6
7
  import BaseCheckbox from '../base/BaseCheckbox.vue'
8
+ import BaseDropdown from '../base/BaseDropdown.vue'
7
9
 
8
10
  const settings = usePreviewSettingsStore().currentSettings
9
11
 
@@ -29,15 +31,17 @@ const responsiveHeight = autoWhenEmpty('responsiveHeight')
29
31
 
30
32
  <template>
31
33
  <!-- Responsive size -->
32
- <VDropdown
33
- placement="bottom-end"
34
- :skidding="6"
34
+ <BaseDropdown
35
+ side="bottom"
36
+ align="end"
37
+ :align-offset="6"
35
38
  :disabled="!povesteConfig.responsivePresets?.length"
39
+ tooltip="Responsive sizes"
36
40
  class="poveste-toolbar-responsive-size flex-none"
37
41
  >
38
- <div
39
- v-tooltip="'Responsive sizes'"
42
+ <button
40
43
  class="flex items-center gap-1 px-2.5 py-1.5 text-gray-900 dark:text-gray-100 transition-colors group"
44
+ aria-label="Responsive sizes"
41
45
  :class="{
42
46
  'hover:bg-white/50 dark:hover:bg-white/10 hover:text-primary-500 dark:hover:text-primary-400 cursor-pointer': povesteConfig.responsivePresets?.length,
43
47
  }"
@@ -50,32 +54,34 @@ const responsiveHeight = autoWhenEmpty('responsiveHeight')
50
54
  icon="carbon:chevron-down"
51
55
  class="w-3 h-3 opacity-40 group-hover:opacity-70"
52
56
  />
53
- </div>
57
+ </button>
54
58
 
55
- <template #popper="{ hide }">
59
+ <template #popper="{ close }">
56
60
  <div class="flex flex-col items-stretch">
57
61
  <BaseCheckbox v-model="settings.rotate">
58
62
  Rotate
59
63
  </BaseCheckbox>
60
64
 
61
65
  <div class="flex items-center gap-2 px-4 py-3">
62
- <input
63
- v-model="responsiveWidth"
64
- v-tooltip="'Responsive width (px)'"
65
- type="number"
66
- class="bg-transparent border border-gray-200 dark:border-gray-850 rounded w-20 opacity-50 focus:opacity-100 flex-1 min-w-0"
67
- step="16"
68
- placeholder="Auto"
69
- >
66
+ <HstTooltip content="Responsive width (px)">
67
+ <input
68
+ v-model="responsiveWidth"
69
+ type="number"
70
+ class="bg-transparent border border-gray-200 dark:border-gray-850 rounded w-20 opacity-50 focus:opacity-100 flex-1 min-w-0"
71
+ step="16"
72
+ placeholder="Auto"
73
+ >
74
+ </HstTooltip>
70
75
  <span class="opacity-50">×</span>
71
- <input
72
- v-model="responsiveHeight"
73
- v-tooltip="'Responsive height (px)'"
74
- type="number"
75
- class="bg-transparent border border-gray-200 dark:border-gray-850 rounded w-20 opacity-50 focus:opacity-100 flex-1 min-w-0"
76
- step="16"
77
- placeholder="Auto"
78
- >
76
+ <HstTooltip content="Responsive height (px)">
77
+ <input
78
+ v-model="responsiveHeight"
79
+ type="number"
80
+ class="bg-transparent border border-gray-200 dark:border-gray-850 rounded w-20 opacity-50 focus:opacity-100 flex-1 min-w-0"
81
+ step="16"
82
+ placeholder="Auto"
83
+ >
84
+ </HstTooltip>
79
85
  </div>
80
86
 
81
87
  <button
@@ -87,7 +93,7 @@ const responsiveHeight = autoWhenEmpty('responsiveHeight')
87
93
  ? 'bg-primary-500 hover:bg-primary-600 text-white dark:text-black'
88
94
  : 'bg-transparent hover:bg-primary-100 dark:hover:bg-primary-700',
89
95
  ]"
90
- @click="settings.responsiveWidth = preset.width;settings.responsiveHeight = preset.height ?? null;hide()"
96
+ @click="settings.responsiveWidth = preset.width;settings.responsiveHeight = preset.height ?? null;close()"
91
97
  >
92
98
  {{ preset.label }}
93
99
  <span class="ml-auto opacity-70 flex gap-1">
@@ -98,5 +104,5 @@ const responsiveHeight = autoWhenEmpty('responsiveHeight')
98
104
  </button>
99
105
  </div>
100
106
  </template>
101
- </VDropdown>
107
+ </BaseDropdown>
102
108
  </template>
@@ -1,5 +1,6 @@
1
1
  <script lang="ts" setup>
2
2
  import { Icon } from '@iconify/vue'
3
+ import { HstTooltip } from '@poveste/controls'
3
4
  import { usePreviewSettingsStore } from '../../stores/preview-settings'
4
5
  import TopBarChipItem from '../app/TopBarChipItem.vue'
5
6
 
@@ -7,15 +8,18 @@ const settings = usePreviewSettingsStore().currentSettings
7
8
  </script>
8
9
 
9
10
  <template>
10
- <TopBarChipItem
11
- v-tooltip="`Switch to text direction ${settings.textDirection === 'ltr' ? 'Right to Left' : 'Left to Right'}`"
12
- aria-label="Toggle text direction"
13
- class="poveste-toolbar-text-direction"
14
- @click="settings.textDirection = settings.textDirection === 'ltr' ? 'rtl' : 'ltr'"
11
+ <HstTooltip
12
+ :content="`Switch to text direction ${settings.textDirection === 'ltr' ? 'Right to Left' : 'Left to Right'}`"
15
13
  >
16
- <Icon
17
- :icon="settings.textDirection === 'ltr' ? 'fluent:text-paragraph-direction-right-16-regular' : 'fluent:text-paragraph-direction-left-16-regular'"
18
- class="w-4 h-4"
19
- />
20
- </TopBarChipItem>
14
+ <TopBarChipItem
15
+ aria-label="Toggle text direction"
16
+ class="poveste-toolbar-text-direction"
17
+ @click="settings.textDirection = settings.textDirection === 'ltr' ? 'rtl' : 'ltr'"
18
+ >
19
+ <Icon
20
+ :icon="settings.textDirection === 'ltr' ? 'fluent:text-paragraph-direction-right-16-regular' : 'fluent:text-paragraph-direction-left-16-regular'"
21
+ class="w-4 h-4"
22
+ />
23
+ </TopBarChipItem>
24
+ </HstTooltip>
21
25
  </template>
@@ -4,8 +4,8 @@ import { Icon } from '@iconify/vue'
4
4
  import { computed } from 'vue'
5
5
 
6
6
  const props = defineProps<{
7
- variant?: Variant
8
- story?: Story
7
+ variant?: Variant | undefined
8
+ story?: Story | undefined
9
9
  }>()
10
10
 
11
11
  const icon = computed(() => props.variant?.icon ?? props.story?.icon ?? 'carbon:cube')
@@ -63,8 +63,8 @@ function toggleOpen() {
63
63
  :depth="0"
64
64
  />
65
65
  <StoryListItem
66
- v-else
67
- :story="stories[(element as TreeLeaf).index]"
66
+ v-else-if="stories[(element as TreeLeaf).index]"
67
+ :story="stories[(element as TreeLeaf).index]!"
68
68
  :depth="0"
69
69
  />
70
70
  </template>
@@ -27,8 +27,8 @@ defineProps<{
27
27
  :stories="stories"
28
28
  />
29
29
  <StoryListItem
30
- v-else
31
- :story="stories[(element as TreeLeaf).index]"
30
+ v-else-if="stories[(element as TreeLeaf).index]"
31
+ :story="stories[(element as TreeLeaf).index]!"
32
32
  />
33
33
  </template>
34
34
  </div>
@@ -72,8 +72,8 @@ const folderPadding = computed(() => {
72
72
  :depth="depth + 1"
73
73
  />
74
74
  <StoryListItem
75
- v-else
76
- :story="stories[(element as TreeLeaf).index]"
75
+ v-else-if="stories[(element as TreeLeaf).index]"
76
+ :story="stories[(element as TreeLeaf).index]!"
77
77
  :depth="depth + 1"
78
78
  />
79
79
  </template>
@@ -25,7 +25,7 @@ const filePadding = computed(() => {
25
25
  })
26
26
 
27
27
  const route = useRoute()
28
- const isActive = computed(() => route.params.storyId === props.story.id)
28
+ const isActive = computed(() => route.params['storyId'] === props.story.id)
29
29
  const el = ref<HTMLDivElement>()
30
30
  useScrollOnActive(isActive, el)
31
31
  </script>
package/src/app/index.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { addCollection } from '@iconify/vue'
2
- import FloatingVue from 'floating-vue'
3
2
  import { createPinia } from 'pinia'
4
3
  import { createApp } from 'vue'
5
4
  import App from './App.vue'
@@ -19,22 +18,6 @@ export async function mountMainApp() {
19
18
 
20
19
  const app = createApp(App)
21
20
  app.use(createPinia())
22
- app.use(FloatingVue, {
23
- // Anchor poppers inside the chrome scope so the @scope-wrapped chrome CSS
24
- // reaches them. The default <body> teleport target is outside the scope.
25
- container: '.poveste-app-root',
26
- overflowPadding: 4,
27
- arrowPadding: 8,
28
- themes: {
29
- tooltip: {
30
- distance: 8,
31
- },
32
- dropdown: {
33
- computeTransformOrigin: true,
34
- distance: 8,
35
- },
36
- },
37
- })
38
21
  app.use(router)
39
22
  app.mount('#app')
40
23
 
@@ -22,8 +22,8 @@ const query = parseQuery(window.location.search)
22
22
  // What this realm serves. Set from the URL on boot, and again by a
23
23
  // SANDBOX_RETARGET from the host: a warm realm is handed the next story or
24
24
  // variant instead of being torn down for a new document (#240).
25
- const storyId = ref(typeof query.storyId === 'string' ? query.storyId : null)
26
- const variantId = ref(typeof query.variantId === 'string' ? query.variantId : null)
25
+ const storyId = ref(typeof query['storyId'] === 'string' ? query['storyId'] : null)
26
+ const variantId = ref(typeof query['variantId'] === 'string' ? query['variantId'] : null)
27
27
 
28
28
  // Kept in step so `logEvent` can name the occupant it is speaking for; it posts
29
29
  // from the story's own code and cannot see these refs.
@@ -147,6 +147,12 @@ const app = createApp({
147
147
  let mounted = false
148
148
 
149
149
  window.addEventListener('message', (event) => {
150
+ // The sandbox end of the check the host makes in
151
+ // `StoryVariantSinglePreviewRemote`. `__sandbox.html` is a public URL in
152
+ // every published book, and a page that iframes it is its `parent`, so
153
+ // without this anyone embedding it could write story state, retarget it,
154
+ // or restyle it. Only the book drives its own sandbox (#379).
155
+ if (event.origin !== window.location.origin) return
150
156
  // console.log('[sandbox] received message', event.data)
151
157
  if (event.data?.type === STATE_SYNC) {
152
158
  if (!mounted || !variant.value) return
@@ -204,6 +210,13 @@ const app = createApp({
204
210
  // GenericMountStory as an attr, so plugins that don't know the prop
205
211
  // ignore it.
206
212
  targetVariantId: variantId.value,
213
+ // And it does not own the state here. The render tree below syncs the
214
+ // same `variant.state` against the same story, so a live sync from
215
+ // this pass walks the whole graph a second time for every edit — two
216
+ // of the sandbox's three syncs, where the app realm runs one (#964).
217
+ // Same attr fall-through, so a plugin that does not know it ignores it
218
+ // and keeps the behaviour it had.
219
+ syncState: false,
207
220
  }),
208
221
  ]),
209
222
  this.story && this.variant
@@ -229,7 +242,7 @@ app.use(createPinia())
229
242
  app.mount('#app')
230
243
 
231
244
  // Tagging body itself as a story render root puts components teleported to
232
- // document.body (floating-vue popper, dialogs) inside the user-CSS @scope
245
+ // document.body (poppers, dialogs) inside the user-CSS @scope
233
246
  // boundary applied in dev. The custom-controls class opts out of poveste-app
234
247
  // source-level rules that add overflow/min-height to the render root.
235
248
  document.body.classList.add('__poveste-render-story', '__poveste-render-custom-controls')
@@ -9,9 +9,9 @@ export const useStoryStore = defineStore('story', () => {
9
9
  stories.value = value
10
10
  }
11
11
 
12
- const currentStory = computed(() => stories.value.find(s => s.id === router.currentRoute.value.params.storyId))
12
+ const currentStory = computed(() => stories.value.find(s => s.id === router.currentRoute.value.params['storyId']))
13
13
 
14
- const currentVariant = computed(() => currentStory.value?.variants.find(v => v.id === router.currentRoute.value.query.variantId))
14
+ const currentVariant = computed(() => currentStory.value?.variants.find(v => v.id === router.currentRoute.value.query['variantId']))
15
15
 
16
16
  const maps = computed(() => {
17
17
  const storyMap = new Map<string, Story>()
@@ -2,10 +2,8 @@
2
2
  this file is compiled by the postcss CLI into dist/style.css, which rebases
3
3
  font URLs relative to the *source* and ships a path into node_modules. Vite
4
4
  processes the entries and hashes the files into the book (#219). */
5
- @import 'floating-vue/dist/style.css';
6
5
  @import '@poveste/controls/dist/index.es.css';
7
6
 
8
- @import './floating.pcss';
9
7
  @import './transitions.pcss';
10
8
 
11
9
  /*
@@ -17,6 +15,11 @@
17
15
  @import 'tailwindcss/theme.css' layer(theme);
18
16
  @import 'tailwindcss/utilities.css' layer(utilities);
19
17
 
18
+ /* The chrome's tokens, shared with `@poveste/controls` — see the file for why
19
+ both packages read them rather than each declaring its own. The relative path
20
+ is the one `@source` below already uses. */
21
+ @import '../../../../poveste-controls/src/style/tokens.css';
22
+
20
23
  /* v4 auto-detection only scans this package; the app renders controls, so their
21
24
  utility classes must be generated here too (was a content glob in v3). */
22
25
  @source "../../../../poveste-controls/src";
@@ -32,47 +35,6 @@
32
35
  in v3 the `ptw-` prefix applied to the dark class and kept them separate. */
33
36
  @custom-variant dark (&:where(.ptw-dark, .ptw-dark *));
34
37
 
35
- @theme {
36
- /*
37
- * primary + gray are themable at runtime: resolved-theme.ts injects
38
- * --_poveste-color-<name>-<key> as space-separated RGB channels, and v4's
39
- * native color-mix handles opacity (replacing the v3 withOpacityValue shim).
40
- */
41
- --color-primary-50: rgb(var(--_poveste-color-primary-50));
42
- --color-primary-100: rgb(var(--_poveste-color-primary-100));
43
- --color-primary-200: rgb(var(--_poveste-color-primary-200));
44
- --color-primary-300: rgb(var(--_poveste-color-primary-300));
45
- --color-primary-400: rgb(var(--_poveste-color-primary-400));
46
- --color-primary-500: rgb(var(--_poveste-color-primary-500));
47
- --color-primary-600: rgb(var(--_poveste-color-primary-600));
48
- --color-primary-700: rgb(var(--_poveste-color-primary-700));
49
- --color-primary-800: rgb(var(--_poveste-color-primary-800));
50
- --color-primary-900: rgb(var(--_poveste-color-primary-900));
51
-
52
- --color-gray-50: rgb(var(--_poveste-color-gray-50));
53
- --color-gray-100: rgb(var(--_poveste-color-gray-100));
54
- --color-gray-200: rgb(var(--_poveste-color-gray-200));
55
- --color-gray-300: rgb(var(--_poveste-color-gray-300));
56
- --color-gray-400: rgb(var(--_poveste-color-gray-400));
57
- --color-gray-500: rgb(var(--_poveste-color-gray-500));
58
- --color-gray-600: rgb(var(--_poveste-color-gray-600));
59
- --color-gray-700: rgb(var(--_poveste-color-gray-700));
60
- --color-gray-750: rgb(var(--_poveste-color-gray-750));
61
- --color-gray-800: rgb(var(--_poveste-color-gray-800));
62
- --color-gray-850: rgb(var(--_poveste-color-gray-850));
63
- --color-gray-900: rgb(var(--_poveste-color-gray-900));
64
- --color-gray-950: rgb(var(--_poveste-color-gray-950));
65
-
66
- /* border radius (ported from the root v3 config) */
67
- --radius-sm: 0.25rem;
68
- --radius: 0.375rem;
69
- --radius-md: 0.5rem;
70
- --radius-lg: 0.75rem;
71
- --radius-xl: 1rem;
72
- --radius-2xl: 1.5rem;
73
- --radius-3xl: 2rem;
74
- }
75
-
76
38
  /*
77
39
  * Manual reset — replaces Preflight, which is intentionally disabled.
78
40
  *
@@ -108,6 +70,18 @@
108
70
  font-family: inherit;
109
71
  }
110
72
 
73
+ /* Preflight resets these and the replacement above left them out, so a button
74
+ carrying no background utility painted the UA `ButtonFace`: grey, near enough
75
+ to light chrome to pass, a white panel against dark. */
76
+ button,
77
+ [type='button'],
78
+ [type='reset'],
79
+ [type='submit'] {
80
+ appearance: button;
81
+ background-color: transparent;
82
+ background-image: none;
83
+ }
84
+
111
85
  a,
112
86
  button {
113
87
  user-select: none;
@@ -170,7 +144,7 @@
170
144
  background-repeat: no-repeat;
171
145
  background-position: right;
172
146
 
173
- /* Subject-side, not `.ptw-dark &` — see the note in floating.pcss. */
147
+ /* Subject-side, not `.ptw-dark &` — see the note in BaseDropdown.vue. */
174
148
  &:where(.ptw-dark, .ptw-dark *) {
175
149
  background-image: linear-gradient(to left, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));
176
150
  }
package/src/app/types.ts CHANGED
@@ -33,10 +33,10 @@ export interface SearchResultBase {
33
33
  rank: number
34
34
  id: string
35
35
  title: string
36
- path?: string[]
37
- icon?: string
38
- iconColor?: string
39
- type?: SearchResultType
36
+ path?: string[] | undefined
37
+ icon?: string | undefined
38
+ iconColor?: string | undefined
39
+ type?: SearchResultType | undefined
40
40
  }
41
41
 
42
42
  export type SearchResult = SearchResultBase & ({
@@ -41,7 +41,7 @@ export const builtinCommands: ClientCommand[] = [
41
41
  label: 'Open Poveste Documentation',
42
42
  icon: 'carbon:help',
43
43
  clientAction: () => {
44
- window.open('https://poveste.dev/guide/getting-started.html', '_blank')
44
+ window.open('https://poveste.dev/guide/getting-started', '_blank')
45
45
  },
46
46
  },
47
47
  ]
@@ -4,7 +4,7 @@ import { povesteConfig } from './config.js'
4
4
 
5
5
  export const isDark = useDark({
6
6
  valueDark: 'ptw-dark',
7
- initialValue: povesteConfig.theme.defaultColorScheme,
7
+ ...povesteConfig.theme.defaultColorScheme ? { initialValue: povesteConfig.theme.defaultColorScheme } : {},
8
8
  storageKey: 'poveste-color-scheme',
9
9
  storage: povesteConfig.theme.storeColorScheme ? localStorage : sessionStorage,
10
10
  })
@@ -2,5 +2,4 @@
2
2
  // `navigator.userAgentData` is Chromium-only, so reading it here would simply
3
3
  // stop detecting macOS in Safari and Firefox — the two places where getting the
4
4
  // ⌘ shortcuts right matters most.
5
- // eslint-disable-next-line ts/no-deprecated
6
5
  export const isMac = navigator.platform.toLowerCase().includes('mac')
@@ -1,7 +1,7 @@
1
1
  import { EVENT_SEND } from './const'
2
2
  import { occupant } from './occupant'
3
3
 
4
- export async function logEvent(name: string, argument) {
4
+ export async function logEvent(name: string, argument: unknown) {
5
5
  const event = {
6
6
  name,
7
7
  argument: JSON.parse(stringifyEvent(argument)), // Needed for HTMLEvent that can't be cloned
@@ -20,10 +20,11 @@ export async function logEvent(name: string, argument) {
20
20
  }
21
21
  }
22
22
 
23
- function stringifyEvent(e) {
24
- const obj = {}
25
- for (const k in e) {
26
- obj[k] = e[k]
23
+ function stringifyEvent(e: unknown) {
24
+ const obj: Record<string, unknown> = {}
25
+ // `for...in` rather than `Object.entries`: an event's fields are inherited.
26
+ for (const k in e as object) {
27
+ obj[k] = Reflect.get(e as object, k)
27
28
  }
28
29
  return JSON.stringify(obj, (k, v) => {
29
30
  if (v instanceof Node) return 'Node'
@@ -67,6 +67,6 @@ export function trimSlots(slots: Slot[]): Slot[] {
67
67
  }
68
68
 
69
69
  let end = next.length
70
- while (end > 0 && !next[end - 1].visible) end--
70
+ while (end > 0 && !next[end - 1]?.visible) end--
71
71
  return end === next.length ? next : next.slice(0, end)
72
72
  }
@@ -2,8 +2,8 @@
2
2
  import type { IconifyJSON } from '@iconify/vue'
3
3
 
4
4
  export const iconCollections: IconifyJSON[] = [
5
- {"prefix":"carbon","icons":{"add-alt":{"body":"<path fill=\"currentColor\" d=\"M16 4c6.6 0 12 5.4 12 12s-5.4 12-12 12S4 22.6 4 16S9.4 4 16 4m0-2C8.3 2 2 8.3 2 16s6.3 14 14 14s14-6.3 14-14S23.7 2 16 2\"/><path fill=\"currentColor\" d=\"M24 15h-7V8h-2v7H8v2h7v7h2v-7h7z\"/>"},"area":{"body":"<path fill=\"currentColor\" d=\"M27 22.142V9.858A3.992 3.992 0 1 0 22.142 5H9.858A3.992 3.992 0 1 0 5 9.858v12.284A3.992 3.992 0 1 0 9.858 27h12.284A3.992 3.992 0 1 0 27 22.142M26 4a2 2 0 1 1-2 2a2 2 0 0 1 2-2M4 6a2 2 0 1 1 2 2a2 2 0 0 1-2-2m2 22a2 2 0 1 1 2-2a2 2 0 0 1-2 2m16.142-3H9.858A4 4 0 0 0 7 22.142V9.858A4 4 0 0 0 9.858 7h12.284A4 4 0 0 0 25 9.858v12.284A3.99 3.99 0 0 0 22.142 25M26 28a2 2 0 1 1 2-2a2.003 2.003 0 0 1-2 2\"/>"},"audio-console":{"body":"<path fill=\"currentColor\" d=\"M28 14.005h-1v-12h-2v12h-1a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1v10h2v-10h1a2.003 2.003 0 0 0 2-2v-2a2 2 0 0 0-2-2m0 4h-4v-2h4Zm-10-12h-1v-4h-2v4h-1a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1v18h2v-18h1a2 2 0 0 0 2-2v-2a2 2 0 0 0-2-2m0 4h-4v-2h4Zm-10 10H7v-18H5v18H4a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1v4h2v-4h1a2 2 0 0 0 2-2v-2a2 2 0 0 0-2-2m0 4H4v-2h4Z\"/>"},"caret-down":{"body":"<path fill=\"currentColor\" d=\"m24 12l-8 10l-8-10z\"/>"},"caret-right":{"body":"<path fill=\"currentColor\" d=\"m12 8l10 8l-10 8z\"/>"},"checkbox":{"body":"<path fill=\"currentColor\" d=\"M26 4H6a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h20a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2M6 26V6h20v20Z\"/>"},"checkmark":{"body":"<path fill=\"currentColor\" d=\"m13 24l-9-9l1.414-1.414L13 21.171L26.586 7.586L28 9z\"/>"},"chevron-down":{"body":"<path fill=\"currentColor\" d=\"M16 22L6 12l1.4-1.4l8.6 8.6l8.6-8.6L26 12z\"/>"},"chevron-right":{"body":"<path fill=\"currentColor\" d=\"M22 16L12 26l-1.4-1.4l8.6-8.6l-8.6-8.6L12 6z\"/>"},"chevron-sort":{"body":"<path fill=\"currentColor\" d=\"m16 28l-7-7l1.41-1.41L16 25.17l5.59-5.58L23 21zm0-24l7 7l-1.41 1.41L16 6.83l-5.59 5.58L9 11z\"/>"},"close":{"body":"<path fill=\"currentColor\" d=\"M17.414 16L24 9.414L22.586 8L16 14.586L9.414 8L8 9.414L14.586 16L8 22.586L9.414 24L16 17.414L22.586 24L24 22.586z\"/>"},"code":{"body":"<path fill=\"currentColor\" d=\"m31 16l-7 7l-1.41-1.41L28.17 16l-5.58-5.59L24 9zM1 16l7-7l1.41 1.41L3.83 16l5.58 5.59L8 23zm11.42 9.484L17.64 6l1.932.517L14.352 26z\"/>"},"code-hide":{"body":"<path fill=\"currentColor\" d=\"m17.713 13.471l1.863-6.953L17.645 6l-1.565 5.838zm6.494 6.494l1.414 1.414L31 16l-7-7l-1.414 1.414L28.172 16zM30 28.586L3.414 2L2 3.414l5.793 5.793L1 16l7 7l1.414-1.414L3.828 16l5.379-5.379l5.677 5.677l-2.461 9.184l1.932.518l2.162-8.069L28.586 30z\"/>"},"color-palette":{"body":"<circle cx=\"10\" cy=\"12\" r=\"2\" fill=\"currentColor\"/><circle cx=\"16\" cy=\"9\" r=\"2\" fill=\"currentColor\"/><circle cx=\"22\" cy=\"12\" r=\"2\" fill=\"currentColor\"/><circle cx=\"23\" cy=\"18\" r=\"2\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"23\" r=\"2\" fill=\"currentColor\"/><path fill=\"currentColor\" d=\"M16.54 2A14 14 0 0 0 2 16a4.82 4.82 0 0 0 6.09 4.65l1.12-.31a3 3 0 0 1 3.79 2.9V27a3 3 0 0 0 3 3a14 14 0 0 0 14-14.54A14.05 14.05 0 0 0 16.54 2m8.11 22.31A11.93 11.93 0 0 1 16 28a1 1 0 0 1-1-1v-3.76a5 5 0 0 0-5-5a5 5 0 0 0-1.33.18l-1.12.31A2.82 2.82 0 0 1 4 16A12 12 0 0 1 16.47 4A12.18 12.18 0 0 1 28 15.53a11.9 11.9 0 0 1-3.35 8.79Z\"/>"},"condition-wait-point":{"body":"<path fill=\"currentColor\" d=\"m8 16l8-8l8 8l-8 8z\"/><path fill=\"currentColor\" d=\"M16 4A12 12 0 1 1 4 16A12.014 12.014 0 0 1 16 4m0-2a14 14 0 1 0 14 14A14 14 0 0 0 16 2\"/>"},"copy-file":{"body":"<path fill=\"currentColor\" d=\"m27.4 14.7l-6.1-6.1C21 8.2 20.5 8 20 8h-8c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V16.1c0-.5-.2-1-.6-1.4M20 10l5.9 6H20zm-8 18V10h6v6c0 1.1.9 2 2 2h6v10z\"/><path fill=\"currentColor\" d=\"M6 18H4V4c0-1.1.9-2 2-2h14v2H6z\"/>"},"cube":{"body":"<path fill=\"currentColor\" d=\"m28.504 8.136l-12-7a1 1 0 0 0-1.008 0l-12 7A1 1 0 0 0 3 9v14a1 1 0 0 0 .496.864l12 7a1 1 0 0 0 1.008 0l12-7A1 1 0 0 0 29 23V9a1 1 0 0 0-.496-.864M16 3.158L26.016 9L16 14.842L5.984 9ZM5 10.74l10 5.833V28.26L5 22.426Zm12 17.52V16.574l10-5.833v11.685Z\"/>"},"cube-view":{"body":"<circle cx=\"16\" cy=\"16\" r=\"2\" fill=\"currentColor\"/><path fill=\"currentColor\" d=\"M23.777 15.479A8.64 8.64 0 0 0 16 10a8.64 8.64 0 0 0-7.777 5.479L8 16l.223.522A8.64 8.64 0 0 0 16 22a8.64 8.64 0 0 0 7.777-5.478L24 16ZM16 20a4 4 0 1 1 4-4a4.005 4.005 0 0 1-4 4\"/><path fill=\"currentColor\" d=\"m28.504 8.136l-12-7a1 1 0 0 0-1.008 0l-12 7A1 1 0 0 0 3 9v14a1 1 0 0 0 .496.864l12 7a1 1 0 0 0 1.008 0l12-7A1 1 0 0 0 29 23V9a1 1 0 0 0-.496-.864M27 22.426l-11 6.416l-11-6.416V9.574l11-6.416l11 6.416Z\"/>"},"data-vis-1":{"body":"<path fill=\"currentColor\" d=\"M26 22a3.96 3.96 0 0 0-2.02.567l-3.813-3.814a4.965 4.965 0 0 0 0-5.506l2.547-2.547A3.028 3.028 0 1 0 21.3 9.286l-2.547 2.547a4.965 4.965 0 0 0-5.506 0L9.433 8.019A3.96 3.96 0 0 0 10 6a4 4 0 1 0-4 4a3.96 3.96 0 0 0 2.02-.567l3.813 3.814a4.965 4.965 0 0 0 0 5.506l-3.814 3.814A3.96 3.96 0 0 0 6 22a4 4 0 1 0 4 4a3.96 3.96 0 0 0-.567-2.02l3.814-3.813a5 5 0 0 0 1.753.732v3.285a3 3 0 1 0 2 0v-3.285a5 5 0 0 0 1.753-.732l3.814 3.814A3.96 3.96 0 0 0 22 26a4 4 0 1 0 4-4m-10-9a3 3 0 1 1-3 3a3.003 3.003 0 0 1 3-3M4 6a2 2 0 1 1 2 2a2 2 0 0 1-2-2m2 22a2 2 0 1 1 2-2a2 2 0 0 1-2 2m20 0a2 2 0 1 1 2-2a2.003 2.003 0 0 1-2 2\"/>"},"devices":{"body":"<path fill=\"currentColor\" d=\"M10 30H4a2 2 0 0 1-2-2V16a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2M4 16v12h6V16Z\"/><path fill=\"currentColor\" d=\"M28 4H6a2 2 0 0 0-2 2v6h2V6h22v14H14v2h2v4h-2v2h9v-2h-5v-4h10a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2\"/>"},"document":{"body":"<path fill=\"currentColor\" d=\"m25.7 9.3l-7-7c-.2-.2-.4-.3-.7-.3H8c-1.1 0-2 .9-2 2v24c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V10c0-.3-.1-.5-.3-.7M18 4.4l5.6 5.6H18zM24 28H8V4h8v6c0 1.1.9 2 2 2h6z\"/><path fill=\"currentColor\" d=\"M10 22h12v2H10zm0-6h12v2H10z\"/>"},"document-blank":{"body":"<path fill=\"currentColor\" d=\"m25.7 9.3l-7-7A.9.9 0 0 0 18 2H8a2.006 2.006 0 0 0-2 2v24a2.006 2.006 0 0 0 2 2h16a2.006 2.006 0 0 0 2-2V10a.9.9 0 0 0-.3-.7M18 4.4l5.6 5.6H18ZM24 28H8V4h8v6a2.006 2.006 0 0 0 2 2h6Z\"/>"},"document-unknown":{"body":"<circle cx=\"9\" cy=\"28.5\" r=\"1.5\" fill=\"currentColor\"/><path fill=\"currentColor\" d=\"M10 25H8v-4h2a2 2 0 0 0 0-4H8a2 2 0 0 0-2 2v.5H4V19a4.005 4.005 0 0 1 4-4h2a4 4 0 0 1 0 8Z\"/><path fill=\"currentColor\" d=\"m27.7 9.3l-7-7A.9.9 0 0 0 20 2H10a2.006 2.006 0 0 0-2 2v8h2V4h8v6a2.006 2.006 0 0 0 2 2h6v16H14v2h12a2.006 2.006 0 0 0 2-2V10a.91.91 0 0 0-.3-.7M20 10V4.4l5.6 5.6Z\"/>"},"edit":{"body":"<path fill=\"currentColor\" d=\"M2 26h28v2H2zM25.4 9c.8-.8.8-2 0-2.8l-3.6-3.6c-.8-.8-2-.8-2.8 0l-15 15V24h6.4zm-5-5L24 7.6l-3 3L17.4 7zM6 22v-3.6l10-10l3.6 3.6l-10 10z\"/>"},"erase":{"body":"<path fill=\"currentColor\" d=\"M7 27h23v2H7zm20.38-16.49l-7.93-7.92a2 2 0 0 0-2.83 0l-14 14a2 2 0 0 0 0 2.83L7.13 24h9.59l10.66-10.66a2 2 0 0 0 0-2.83M15.89 22H8l-4-4l6.31-6.31l7.93 7.92Zm3.76-3.76l-7.92-7.93L18 4l8 7.93Z\"/>"},"event-schedule":{"body":"<path fill=\"currentColor\" d=\"M21 30a8 8 0 1 1 8-8a8 8 0 0 1-8 8m0-14a6 6 0 1 0 6 6a6 6 0 0 0-6-6\"/><path fill=\"currentColor\" d=\"M22.59 25L20 22.41V18h2v3.59l2 2z\"/><path fill=\"currentColor\" d=\"M28 6a2 2 0 0 0-2-2h-4V2h-2v2h-8V2h-2v2H6a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h4v-2H6V6h4v2h2V6h8v2h2V6h4v6h2Z\"/>"},"flash":{"body":"<path fill=\"currentColor\" d=\"M11.61 29.92a1 1 0 0 1-.6-1.07L12.83 17H8a1 1 0 0 1-1-1.23l3-13A1 1 0 0 1 11 2h10a1 1 0 0 1 .78.37a1 1 0 0 1 .2.85L20.25 11H25a1 1 0 0 1 .9.56a1 1 0 0 1-.11 1l-13 17A1 1 0 0 1 12 30a1.1 1.1 0 0 1-.39-.08M17.75 13l2-9H11.8L9.26 15h5.91l-1.59 10.28L23 13Z\"/>"},"help":{"body":"<path fill=\"currentColor\" d=\"M16 2a14 14 0 1 0 14 14A14 14 0 0 0 16 2m0 26a12 12 0 1 1 12-12a12 12 0 0 1-12 12\"/><circle cx=\"16\" cy=\"23.5\" r=\"1.5\" fill=\"currentColor\"/><path fill=\"currentColor\" d=\"M17 8h-1.5a4.49 4.49 0 0 0-4.5 4.5v.5h2v-.5a2.5 2.5 0 0 1 2.5-2.5H17a2.5 2.5 0 0 1 0 5h-2v4.5h2V17a4.5 4.5 0 0 0 0-9\"/>"},"launch":{"body":"<path fill=\"currentColor\" d=\"M26 28H6a2.003 2.003 0 0 1-2-2V6a2.003 2.003 0 0 1 2-2h10v2H6v20h20V16h2v10a2.003 2.003 0 0 1-2 2\"/><path fill=\"currentColor\" d=\"M20 2v2h6.586L18 12.586L19.414 14L28 5.414V12h2V2z\"/>"},"moon":{"body":"<path fill=\"currentColor\" d=\"M13.503 5.414a15.076 15.076 0 0 0 11.593 18.194a11.1 11.1 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1 1 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.07 13.07 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3\"/>"},"open-panel-filled-bottom":{"body":"<path fill=\"currentColor\" d=\"M28 4H4a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2m0 2v12H4V6Z\"/>"},"open-panel-filled-left":{"body":"<path fill=\"currentColor\" d=\"M28 4H4a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2m0 22H12V6h16Z\"/>"},"open-panel-filled-right":{"body":"<path fill=\"currentColor\" d=\"M28 4H4a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2M4 6h16v20H4Z\"/>"},"pan-horizontal":{"body":"<path fill=\"currentColor\" d=\"m24 10l-1.414 1.414L26.172 15H5.828l3.586-3.586L8 10l-6 6l6 6l1.414-1.414L5.828 17h20.344l-3.586 3.586L24 22l6-6z\"/>"},"pan-vertical":{"body":"<path fill=\"currentColor\" d=\"m10 8l1.414 1.414L15 5.828v20.344l-3.586-3.586L10 24l6 6l6-6l-1.414-1.414L17 26.172V5.828l3.586 3.586L22 8l-6-6z\"/>"},"panel-expansion":{"body":"<path fill=\"currentColor\" d=\"M12 6H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2m-6 8V8h6v6Zm20-8h-6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2m-6 18V8h6v16Z\"/>"},"reset":{"body":"<path fill=\"currentColor\" d=\"M18 28A12 12 0 1 0 6 16v6.2l-3.6-3.6L1 20l6 6l6-6l-1.4-1.4L8 22.2V16a10 10 0 1 1 10 10Z\"/>"},"save":{"body":"<path fill=\"currentColor\" d=\"m27.71 9.29l-5-5A1 1 0 0 0 22 4H6a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h20a2 2 0 0 0 2-2V10a1 1 0 0 0-.29-.71M12 6h8v4h-8Zm8 20h-8v-8h8Zm2 0v-8a2 2 0 0 0-2-2h-8a2 2 0 0 0-2 2v8H6V6h4v4a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V6.41l4 4V26Z\"/>"},"screen":{"body":"<path fill=\"currentColor\" d=\"M28 4H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h8v4H8v2h16v-2h-4v-4h8a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2M18 28h-4v-4h4Zm10-6H4V6h24Z\"/>"},"script-reference":{"body":"<path fill=\"currentColor\" d=\"M4 20v2h4.586L2 28.586L3.414 30L10 23.414V28h2v-8zm23.17 6l-2.58 2.58L26 30l4-4l-4-4l-1.42 1.41zm-8.34 0l2.58-2.58L20 22l-4 4l4 4l1.42-1.41zM25.7 9.3l-7-7A.9.9 0 0 0 18 2H8a2.006 2.006 0 0 0-2 2v12h2V4h8v6a2.006 2.006 0 0 0 2 2h6v6h2v-8a.91.91 0 0 0-.3-.7M18 10V4.4l5.6 5.6Z\"/>"},"search":{"body":"<path fill=\"currentColor\" d=\"m29 27.586l-7.552-7.552a11.018 11.018 0 1 0-1.414 1.414L27.586 29ZM4 13a9 9 0 1 1 9 9a9.01 9.01 0 0 1-9-9\"/>"},"shape-except":{"body":"<path fill=\"currentColor\" d=\"M28 10h-6V4a2 2 0 0 0-2-2H4a2.003 2.003 0 0 0-2 2v16a2.003 2.003 0 0 0 2 2h6v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V12a2 2 0 0 0-2-2M12 20v-8h8v8ZM3.999 4H20v6h-8a2 2 0 0 0-2 2v8H4Z\"/>"},"software-resource-reference":{"body":"<path fill=\"currentColor\" d=\"m6.899 10.283l3.394-3.394l1.414 1.414l-3.394 3.394zM4.9 19.7l-2.3-2.3C2.2 17 2 16.5 2 16s.2-1 .6-1.4l2.3-2.3l1.4 1.4L4 16l2.3 2.3zm1.989 2.007l1.414-1.414l3.394 3.394l-1.414 1.414zM16 30c-.5 0-1-.2-1.4-.6l-2.3-2.3l1.4-1.4L16 28l2.3-2.3l1.4 1.4l-2.3 2.3c-.4.4-.9.6-1.4.6m4.293-6.303l3.394-3.394l1.414 1.414l-3.394 3.394zM27.1 19.7l-1.4-1.4L28 16l-2.3-2.3l1.4-1.4l2.3 2.3c.4.4.6.9.6 1.4s-.2 1-.6 1.4zM20.303 8.313l1.414-1.414l3.394 3.394l-1.414 1.414zM16 2c-.5 0-1 .2-1.4.6l-2.3 2.3l1.4 1.4L16 4l2.3 2.3l1.4-1.4l-2.3-2.3C17 2.2 16.5 2 16 2\"/>"},"sun":{"body":"<path fill=\"currentColor\" d=\"M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6M5.394 6.813L6.81 5.399l3.505 3.506L8.9 10.319zM2 15.005h5v2H2zm3.394 10.193L8.9 21.692l1.414 1.414l-3.505 3.506zM15 25.005h2v5h-2zm6.687-1.9l1.414-1.414l3.506 3.506l-1.414 1.414zm3.313-8.1h5v2h-5zm-3.313-6.101l3.506-3.506l1.414 1.414l-3.506 3.506zM15 2.005h2v5h-2z\"/>"},"text-color":{"body":"<path fill=\"currentColor\" d=\"M22 21h2L17 4h-2L8 21h2l1.61-4h8.74Zm-9.57-6l3.44-8.37h.26L19.54 15ZM6 24h20v4H6z\"/>"},"text-font":{"body":"<path fill=\"currentColor\" d=\"M25 12h-5v2h5a1 1 0 0 1 1 1v2h-4a3.003 3.003 0 0 0-3 3v1a3.003 3.003 0 0 0 3 3h6v-9a3.003 3.003 0 0 0-3-3m-3 10a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h4v3Zm-6 2h2L12 7h-2L4 24h2l1.694-5h6.613Zm-7.629-7l2.497-7.371h.266L13.63 17Z\"/>"},"trash-can":{"body":"<path fill=\"currentColor\" d=\"M12 12h2v12h-2zm6 0h2v12h-2z\"/><path fill=\"currentColor\" d=\"M4 6v2h2v20a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V8h2V6Zm4 22V8h16v20Zm4-26h8v2h-8z\"/>"},"view":{"body":"<path fill=\"currentColor\" d=\"M30.94 15.66A16.69 16.69 0 0 0 16 5A16.69 16.69 0 0 0 1.06 15.66a1 1 0 0 0 0 .68A16.69 16.69 0 0 0 16 27a16.69 16.69 0 0 0 14.94-10.66a1 1 0 0 0 0-.68M16 25c-5.3 0-10.9-3.93-12.93-9C5.1 10.93 10.7 7 16 7s10.9 3.93 12.93 9C26.9 21.07 21.3 25 16 25\"/><path fill=\"currentColor\" d=\"M16 10a6 6 0 1 0 6 6a6 6 0 0 0-6-6m0 10a4 4 0 1 1 4-4a4 4 0 0 1-4 4\"/>"},"view-off":{"body":"<path fill=\"currentColor\" d=\"m5.24 22.51l1.43-1.42A14.06 14.06 0 0 1 3.07 16C5.1 10.93 10.7 7 16 7a12.4 12.4 0 0 1 4 .72l1.55-1.56A14.7 14.7 0 0 0 16 5A16.69 16.69 0 0 0 1.06 15.66a1 1 0 0 0 0 .68a16 16 0 0 0 4.18 6.17\"/><path fill=\"currentColor\" d=\"M12 15.73a4 4 0 0 1 3.7-3.7l1.81-1.82a6 6 0 0 0-7.33 7.33Zm18.94-.07a16.4 16.4 0 0 0-5.74-7.44L30 3.41L28.59 2L2 28.59L3.41 30l5.1-5.1A15.3 15.3 0 0 0 16 27a16.69 16.69 0 0 0 14.94-10.66a1 1 0 0 0 0-.68M20 16a4 4 0 0 1-6 3.44L19.44 14a4 4 0 0 1 .56 2m-4 9a13.05 13.05 0 0 1-6-1.58l2.54-2.54a6 6 0 0 0 8.35-8.35l2.87-2.87A14.54 14.54 0 0 1 28.93 16C26.9 21.07 21.3 25 16 25\"/>"},"warning-alt":{"body":"<path fill=\"currentColor\" d=\"M16 23a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 16 23m-1-11h2v9h-2z\"/><path fill=\"currentColor\" d=\"M29 30H3a1 1 0 0 1-.887-1.461l13-25a1 1 0 0 1 1.774 0l13 25A1 1 0 0 1 29 30M4.65 28h22.7l.001-.003L16.002 6.17h-.004L4.648 27.997Z\"/>"}},"lastModified":1785496919,"aliases":{"software-resource-resource":{"parent":"software-resource-reference"}},"width":32,"height":32},
6
- {"prefix":"fluent","icons":{"text-paragraph-direction-left-16-regular":{"body":"<path fill=\"currentColor\" d=\"M9 3a2.5 2.5 0 0 0 0 5h1V3zm2 0v10.5a.5.5 0 0 1-1 0V9H9a3.5 3.5 0 1 1 0-7h4.5a.5.5 0 0 1 0 1H13v10.5a.5.5 0 0 1-1 0V3zM3.854 6.146a.5.5 0 0 1 0 .708L2.707 8l1.147 1.146a.5.5 0 1 1-.708.708l-1.5-1.5a.5.5 0 0 1 0-.708l1.5-1.5a.5.5 0 0 1 .708 0\"/>","width":16,"height":16},"text-paragraph-direction-right-16-regular":{"body":"<path fill=\"currentColor\" d=\"M9 3a2.5 2.5 0 0 0 0 5h1V3zm2 0v10.5a.5.5 0 0 1-1 0V9H9a3.5 3.5 0 1 1 0-7h4.5a.5.5 0 0 1 0 1H13v10.5a.5.5 0 0 1-1 0V3zM2.146 6.146a.5.5 0 0 1 .708 0l1.5 1.5a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708-.708L3.293 8L2.146 6.854a.5.5 0 0 1 0-.708\"/>","width":16,"height":16}},"lastModified":1786851660,"width":20,"height":20},
5
+ {"prefix":"carbon","icons":{"add-alt":{"body":"<path fill=\"currentColor\" d=\"M16 4c6.6 0 12 5.4 12 12s-5.4 12-12 12S4 22.6 4 16S9.4 4 16 4m0-2C8.3 2 2 8.3 2 16s6.3 14 14 14s14-6.3 14-14S23.7 2 16 2\"/><path fill=\"currentColor\" d=\"M24 15h-7V8h-2v7H8v2h7v7h2v-7h7z\"/>"},"area":{"body":"<path fill=\"currentColor\" d=\"M27 22.142V9.858A3.992 3.992 0 1 0 22.142 5H9.858A3.992 3.992 0 1 0 5 9.858v12.284A3.992 3.992 0 1 0 9.858 27h12.284A3.992 3.992 0 1 0 27 22.142M26 4a2 2 0 1 1-2 2a2 2 0 0 1 2-2M4 6a2 2 0 1 1 2 2a2 2 0 0 1-2-2m2 22a2 2 0 1 1 2-2a2 2 0 0 1-2 2m16.142-3H9.858A4 4 0 0 0 7 22.142V9.858A4 4 0 0 0 9.858 7h12.284A4 4 0 0 0 25 9.858v12.284A3.99 3.99 0 0 0 22.142 25M26 28a2 2 0 1 1 2-2a2.003 2.003 0 0 1-2 2\"/>"},"audio-console":{"body":"<path fill=\"currentColor\" d=\"M28 14.005h-1v-12h-2v12h-1a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1v10h2v-10h1a2.003 2.003 0 0 0 2-2v-2a2 2 0 0 0-2-2m0 4h-4v-2h4Zm-10-12h-1v-4h-2v4h-1a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1v18h2v-18h1a2 2 0 0 0 2-2v-2a2 2 0 0 0-2-2m0 4h-4v-2h4Zm-10 10H7v-18H5v18H4a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1v4h2v-4h1a2 2 0 0 0 2-2v-2a2 2 0 0 0-2-2m0 4H4v-2h4Z\"/>"},"calendar":{"body":"<path fill=\"currentColor\" d=\"M26 4h-4V2h-2v2h-8V2h-2v2H6c-1.1 0-2 .9-2 2v20c0 1.1.9 2 2 2h20c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2m0 22H6V12h20zm0-16H6V6h4v2h2V6h8v2h2V6h4z\"/>"},"caret-down":{"body":"<path fill=\"currentColor\" d=\"m24 12l-8 10l-8-10z\"/>"},"caret-right":{"body":"<path fill=\"currentColor\" d=\"m12 8l10 8l-10 8z\"/>"},"checkbox":{"body":"<path fill=\"currentColor\" d=\"M26 4H6a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h20a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2M6 26V6h20v20Z\"/>"},"checkmark":{"body":"<path fill=\"currentColor\" d=\"m13 24l-9-9l1.414-1.414L13 21.171L26.586 7.586L28 9z\"/>"},"chevron-down":{"body":"<path fill=\"currentColor\" d=\"M16 22L6 12l1.4-1.4l8.6 8.6l8.6-8.6L26 12z\"/>"},"chevron-left":{"body":"<path fill=\"currentColor\" d=\"M10 16L20 6l1.4 1.4l-8.6 8.6l8.6 8.6L20 26z\"/>"},"chevron-right":{"body":"<path fill=\"currentColor\" d=\"M22 16L12 26l-1.4-1.4l8.6-8.6l-8.6-8.6L12 6z\"/>"},"chevron-sort":{"body":"<path fill=\"currentColor\" d=\"m16 28l-7-7l1.41-1.41L16 25.17l5.59-5.58L23 21zm0-24l7 7l-1.41 1.41L16 6.83l-5.59 5.58L9 11z\"/>"},"close":{"body":"<path fill=\"currentColor\" d=\"M17.414 16L24 9.414L22.586 8L16 14.586L9.414 8L8 9.414L14.586 16L8 22.586L9.414 24L16 17.414L22.586 24L24 22.586z\"/>"},"code":{"body":"<path fill=\"currentColor\" d=\"m31 16l-7 7l-1.41-1.41L28.17 16l-5.58-5.59L24 9zM1 16l7-7l1.41 1.41L3.83 16l5.58 5.59L8 23zm11.42 9.484L17.64 6l1.932.517L14.352 26z\"/>"},"code-hide":{"body":"<path fill=\"currentColor\" d=\"m17.713 13.471l1.863-6.953L17.645 6l-1.565 5.838zm6.494 6.494l1.414 1.414L31 16l-7-7l-1.414 1.414L28.172 16zM30 28.586L3.414 2L2 3.414l5.793 5.793L1 16l7 7l1.414-1.414L3.828 16l5.379-5.379l5.677 5.677l-2.461 9.184l1.932.518l2.162-8.069L28.586 30z\"/>"},"color-palette":{"body":"<circle cx=\"10\" cy=\"12\" r=\"2\" fill=\"currentColor\"/><circle cx=\"16\" cy=\"9\" r=\"2\" fill=\"currentColor\"/><circle cx=\"22\" cy=\"12\" r=\"2\" fill=\"currentColor\"/><circle cx=\"23\" cy=\"18\" r=\"2\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"23\" r=\"2\" fill=\"currentColor\"/><path fill=\"currentColor\" d=\"M16.54 2A14 14 0 0 0 2 16a4.82 4.82 0 0 0 6.09 4.65l1.12-.31a3 3 0 0 1 3.79 2.9V27a3 3 0 0 0 3 3a14 14 0 0 0 14-14.54A14.05 14.05 0 0 0 16.54 2m8.11 22.31A11.93 11.93 0 0 1 16 28a1 1 0 0 1-1-1v-3.76a5 5 0 0 0-5-5a5 5 0 0 0-1.33.18l-1.12.31A2.82 2.82 0 0 1 4 16A12 12 0 0 1 16.47 4A12.18 12.18 0 0 1 28 15.53a11.9 11.9 0 0 1-3.35 8.79Z\"/>"},"condition-wait-point":{"body":"<path fill=\"currentColor\" d=\"m8 16l8-8l8 8l-8 8z\"/><path fill=\"currentColor\" d=\"M16 4A12 12 0 1 1 4 16A12.014 12.014 0 0 1 16 4m0-2a14 14 0 1 0 14 14A14 14 0 0 0 16 2\"/>"},"copy-file":{"body":"<path fill=\"currentColor\" d=\"m27.4 14.7l-6.1-6.1C21 8.2 20.5 8 20 8h-8c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V16.1c0-.5-.2-1-.6-1.4M20 10l5.9 6H20zm-8 18V10h6v6c0 1.1.9 2 2 2h6v10z\"/><path fill=\"currentColor\" d=\"M6 18H4V4c0-1.1.9-2 2-2h14v2H6z\"/>"},"cube":{"body":"<path fill=\"currentColor\" d=\"m28.504 8.136l-12-7a1 1 0 0 0-1.008 0l-12 7A1 1 0 0 0 3 9v14a1 1 0 0 0 .496.864l12 7a1 1 0 0 0 1.008 0l12-7A1 1 0 0 0 29 23V9a1 1 0 0 0-.496-.864M16 3.158L26.016 9L16 14.842L5.984 9ZM5 10.74l10 5.833V28.26L5 22.426Zm12 17.52V16.574l10-5.833v11.685Z\"/>"},"cube-view":{"body":"<circle cx=\"16\" cy=\"16\" r=\"2\" fill=\"currentColor\"/><path fill=\"currentColor\" d=\"M23.777 15.479A8.64 8.64 0 0 0 16 10a8.64 8.64 0 0 0-7.777 5.479L8 16l.223.522A8.64 8.64 0 0 0 16 22a8.64 8.64 0 0 0 7.777-5.478L24 16ZM16 20a4 4 0 1 1 4-4a4.005 4.005 0 0 1-4 4\"/><path fill=\"currentColor\" d=\"m28.504 8.136l-12-7a1 1 0 0 0-1.008 0l-12 7A1 1 0 0 0 3 9v14a1 1 0 0 0 .496.864l12 7a1 1 0 0 0 1.008 0l12-7A1 1 0 0 0 29 23V9a1 1 0 0 0-.496-.864M27 22.426l-11 6.416l-11-6.416V9.574l11-6.416l11 6.416Z\"/>"},"data-vis-1":{"body":"<path fill=\"currentColor\" d=\"M26 22a3.96 3.96 0 0 0-2.02.567l-3.813-3.814a4.965 4.965 0 0 0 0-5.506l2.547-2.547A3.028 3.028 0 1 0 21.3 9.286l-2.547 2.547a4.965 4.965 0 0 0-5.506 0L9.433 8.019A3.96 3.96 0 0 0 10 6a4 4 0 1 0-4 4a3.96 3.96 0 0 0 2.02-.567l3.813 3.814a4.965 4.965 0 0 0 0 5.506l-3.814 3.814A3.96 3.96 0 0 0 6 22a4 4 0 1 0 4 4a3.96 3.96 0 0 0-.567-2.02l3.814-3.813a5 5 0 0 0 1.753.732v3.285a3 3 0 1 0 2 0v-3.285a5 5 0 0 0 1.753-.732l3.814 3.814A3.96 3.96 0 0 0 22 26a4 4 0 1 0 4-4m-10-9a3 3 0 1 1-3 3a3.003 3.003 0 0 1 3-3M4 6a2 2 0 1 1 2 2a2 2 0 0 1-2-2m2 22a2 2 0 1 1 2-2a2 2 0 0 1-2 2m20 0a2 2 0 1 1 2-2a2.003 2.003 0 0 1-2 2\"/>"},"devices":{"body":"<path fill=\"currentColor\" d=\"M10 30H4a2 2 0 0 1-2-2V16a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2M4 16v12h6V16Z\"/><path fill=\"currentColor\" d=\"M28 4H6a2 2 0 0 0-2 2v6h2V6h22v14H14v2h2v4h-2v2h9v-2h-5v-4h10a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2\"/>"},"document":{"body":"<path fill=\"currentColor\" d=\"m25.7 9.3l-7-7c-.2-.2-.4-.3-.7-.3H8c-1.1 0-2 .9-2 2v24c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V10c0-.3-.1-.5-.3-.7M18 4.4l5.6 5.6H18zM24 28H8V4h8v6c0 1.1.9 2 2 2h6z\"/><path fill=\"currentColor\" d=\"M10 22h12v2H10zm0-6h12v2H10z\"/>"},"document-blank":{"body":"<path fill=\"currentColor\" d=\"m25.7 9.3l-7-7A.9.9 0 0 0 18 2H8a2.006 2.006 0 0 0-2 2v24a2.006 2.006 0 0 0 2 2h16a2.006 2.006 0 0 0 2-2V10a.9.9 0 0 0-.3-.7M18 4.4l5.6 5.6H18ZM24 28H8V4h8v6a2.006 2.006 0 0 0 2 2h6Z\"/>"},"document-unknown":{"body":"<circle cx=\"9\" cy=\"28.5\" r=\"1.5\" fill=\"currentColor\"/><path fill=\"currentColor\" d=\"M10 25H8v-4h2a2 2 0 0 0 0-4H8a2 2 0 0 0-2 2v.5H4V19a4.005 4.005 0 0 1 4-4h2a4 4 0 0 1 0 8Z\"/><path fill=\"currentColor\" d=\"m27.7 9.3l-7-7A.9.9 0 0 0 20 2H10a2.006 2.006 0 0 0-2 2v8h2V4h8v6a2.006 2.006 0 0 0 2 2h6v16H14v2h12a2.006 2.006 0 0 0 2-2V10a.91.91 0 0 0-.3-.7M20 10V4.4l5.6 5.6Z\"/>"},"edit":{"body":"<path fill=\"currentColor\" d=\"M2 26h28v2H2zM25.4 9c.8-.8.8-2 0-2.8l-3.6-3.6c-.8-.8-2-.8-2.8 0l-15 15V24h6.4zm-5-5L24 7.6l-3 3L17.4 7zM6 22v-3.6l10-10l3.6 3.6l-10 10z\"/>"},"erase":{"body":"<path fill=\"currentColor\" d=\"M7 27h23v2H7zm20.38-16.49l-7.93-7.92a2 2 0 0 0-2.83 0l-14 14a2 2 0 0 0 0 2.83L7.13 24h9.59l10.66-10.66a2 2 0 0 0 0-2.83M15.89 22H8l-4-4l6.31-6.31l7.93 7.92Zm3.76-3.76l-7.92-7.93L18 4l8 7.93Z\"/>"},"event-schedule":{"body":"<path fill=\"currentColor\" d=\"M21 30a8 8 0 1 1 8-8a8 8 0 0 1-8 8m0-14a6 6 0 1 0 6 6a6 6 0 0 0-6-6\"/><path fill=\"currentColor\" d=\"M22.59 25L20 22.41V18h2v3.59l2 2z\"/><path fill=\"currentColor\" d=\"M28 6a2 2 0 0 0-2-2h-4V2h-2v2h-8V2h-2v2H6a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h4v-2H6V6h4v2h2V6h8v2h2V6h4v6h2Z\"/>"},"flash":{"body":"<path fill=\"currentColor\" d=\"M11.61 29.92a1 1 0 0 1-.6-1.07L12.83 17H8a1 1 0 0 1-1-1.23l3-13A1 1 0 0 1 11 2h10a1 1 0 0 1 .78.37a1 1 0 0 1 .2.85L20.25 11H25a1 1 0 0 1 .9.56a1 1 0 0 1-.11 1l-13 17A1 1 0 0 1 12 30a1.1 1.1 0 0 1-.39-.08M17.75 13l2-9H11.8L9.26 15h5.91l-1.59 10.28L23 13Z\"/>"},"help":{"body":"<path fill=\"currentColor\" d=\"M16 2a14 14 0 1 0 14 14A14 14 0 0 0 16 2m0 26a12 12 0 1 1 12-12a12 12 0 0 1-12 12\"/><circle cx=\"16\" cy=\"23.5\" r=\"1.5\" fill=\"currentColor\"/><path fill=\"currentColor\" d=\"M17 8h-1.5a4.49 4.49 0 0 0-4.5 4.5v.5h2v-.5a2.5 2.5 0 0 1 2.5-2.5H17a2.5 2.5 0 0 1 0 5h-2v4.5h2V17a4.5 4.5 0 0 0 0-9\"/>"},"launch":{"body":"<path fill=\"currentColor\" d=\"M26 28H6a2.003 2.003 0 0 1-2-2V6a2.003 2.003 0 0 1 2-2h10v2H6v20h20V16h2v10a2.003 2.003 0 0 1-2 2\"/><path fill=\"currentColor\" d=\"M20 2v2h6.586L18 12.586L19.414 14L28 5.414V12h2V2z\"/>"},"moon":{"body":"<path fill=\"currentColor\" d=\"M13.503 5.414a15.076 15.076 0 0 0 11.593 18.194a11.1 11.1 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1 1 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.07 13.07 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3\"/>"},"open-panel-filled-bottom":{"body":"<path fill=\"currentColor\" d=\"M28 4H4a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2m0 2v12H4V6Z\"/>"},"open-panel-filled-left":{"body":"<path fill=\"currentColor\" d=\"M28 4H4a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2m0 22H12V6h16Z\"/>"},"open-panel-filled-right":{"body":"<path fill=\"currentColor\" d=\"M28 4H4a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2M4 6h16v20H4Z\"/>"},"pan-horizontal":{"body":"<path fill=\"currentColor\" d=\"m24 10l-1.414 1.414L26.172 15H5.828l3.586-3.586L8 10l-6 6l6 6l1.414-1.414L5.828 17h20.344l-3.586 3.586L24 22l6-6z\"/>"},"pan-vertical":{"body":"<path fill=\"currentColor\" d=\"m10 8l1.414 1.414L15 5.828v20.344l-3.586-3.586L10 24l6 6l6-6l-1.414-1.414L17 26.172V5.828l3.586 3.586L22 8l-6-6z\"/>"},"panel-expansion":{"body":"<path fill=\"currentColor\" d=\"M12 6H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2m-6 8V8h6v6Zm20-8h-6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2m-6 18V8h6v16Z\"/>"},"reset":{"body":"<path fill=\"currentColor\" d=\"M18 28A12 12 0 1 0 6 16v6.2l-3.6-3.6L1 20l6 6l6-6l-1.4-1.4L8 22.2V16a10 10 0 1 1 10 10Z\"/>"},"save":{"body":"<path fill=\"currentColor\" d=\"m27.71 9.29l-5-5A1 1 0 0 0 22 4H6a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h20a2 2 0 0 0 2-2V10a1 1 0 0 0-.29-.71M12 6h8v4h-8Zm8 20h-8v-8h8Zm2 0v-8a2 2 0 0 0-2-2h-8a2 2 0 0 0-2 2v8H6V6h4v4a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V6.41l4 4V26Z\"/>"},"screen":{"body":"<path fill=\"currentColor\" d=\"M28 4H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h8v4H8v2h16v-2h-4v-4h8a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2M18 28h-4v-4h4Zm10-6H4V6h24Z\"/>"},"script-reference":{"body":"<path fill=\"currentColor\" d=\"M4 20v2h4.586L2 28.586L3.414 30L10 23.414V28h2v-8zm23.17 6l-2.58 2.58L26 30l4-4l-4-4l-1.42 1.41zm-8.34 0l2.58-2.58L20 22l-4 4l4 4l1.42-1.41zM25.7 9.3l-7-7A.9.9 0 0 0 18 2H8a2.006 2.006 0 0 0-2 2v12h2V4h8v6a2.006 2.006 0 0 0 2 2h6v6h2v-8a.91.91 0 0 0-.3-.7M18 10V4.4l5.6 5.6Z\"/>"},"search":{"body":"<path fill=\"currentColor\" d=\"m29 27.586l-7.552-7.552a11.018 11.018 0 1 0-1.414 1.414L27.586 29ZM4 13a9 9 0 1 1 9 9a9.01 9.01 0 0 1-9-9\"/>"},"shape-except":{"body":"<path fill=\"currentColor\" d=\"M28 10h-6V4a2 2 0 0 0-2-2H4a2.003 2.003 0 0 0-2 2v16a2.003 2.003 0 0 0 2 2h6v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V12a2 2 0 0 0-2-2M12 20v-8h8v8ZM3.999 4H20v6h-8a2 2 0 0 0-2 2v8H4Z\"/>"},"software-resource-reference":{"body":"<path fill=\"currentColor\" d=\"m6.899 10.283l3.394-3.394l1.414 1.414l-3.394 3.394zM4.9 19.7l-2.3-2.3C2.2 17 2 16.5 2 16s.2-1 .6-1.4l2.3-2.3l1.4 1.4L4 16l2.3 2.3zm1.989 2.007l1.414-1.414l3.394 3.394l-1.414 1.414zM16 30c-.5 0-1-.2-1.4-.6l-2.3-2.3l1.4-1.4L16 28l2.3-2.3l1.4 1.4l-2.3 2.3c-.4.4-.9.6-1.4.6m4.293-6.303l3.394-3.394l1.414 1.414l-3.394 3.394zM27.1 19.7l-1.4-1.4L28 16l-2.3-2.3l1.4-1.4l2.3 2.3c.4.4.6.9.6 1.4s-.2 1-.6 1.4zM20.303 8.313l1.414-1.414l3.394 3.394l-1.414 1.414zM16 2c-.5 0-1 .2-1.4.6l-2.3 2.3l1.4 1.4L16 4l2.3 2.3l1.4-1.4l-2.3-2.3C17 2.2 16.5 2 16 2\"/>"},"sun":{"body":"<path fill=\"currentColor\" d=\"M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6M5.394 6.813L6.81 5.399l3.505 3.506L8.9 10.319zM2 15.005h5v2H2zm3.394 10.193L8.9 21.692l1.414 1.414l-3.505 3.506zM15 25.005h2v5h-2zm6.687-1.9l1.414-1.414l3.506 3.506l-1.414 1.414zm3.313-8.1h5v2h-5zm-3.313-6.101l3.506-3.506l1.414 1.414l-3.506 3.506zM15 2.005h2v5h-2z\"/>"},"text-color":{"body":"<path fill=\"currentColor\" d=\"M22 21h2L17 4h-2L8 21h2l1.61-4h8.74Zm-9.57-6l3.44-8.37h.26L19.54 15ZM6 24h20v4H6z\"/>"},"text-font":{"body":"<path fill=\"currentColor\" d=\"M25 12h-5v2h5a1 1 0 0 1 1 1v2h-4a3.003 3.003 0 0 0-3 3v1a3.003 3.003 0 0 0 3 3h6v-9a3.003 3.003 0 0 0-3-3m-3 10a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h4v3Zm-6 2h2L12 7h-2L4 24h2l1.694-5h6.613Zm-7.629-7l2.497-7.371h.266L13.63 17Z\"/>"},"trash-can":{"body":"<path fill=\"currentColor\" d=\"M12 12h2v12h-2zm6 0h2v12h-2z\"/><path fill=\"currentColor\" d=\"M4 6v2h2v20a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V8h2V6Zm4 22V8h16v20Zm4-26h8v2h-8z\"/>"},"view":{"body":"<path fill=\"currentColor\" d=\"M30.94 15.66A16.69 16.69 0 0 0 16 5A16.69 16.69 0 0 0 1.06 15.66a1 1 0 0 0 0 .68A16.69 16.69 0 0 0 16 27a16.69 16.69 0 0 0 14.94-10.66a1 1 0 0 0 0-.68M16 25c-5.3 0-10.9-3.93-12.93-9C5.1 10.93 10.7 7 16 7s10.9 3.93 12.93 9C26.9 21.07 21.3 25 16 25\"/><path fill=\"currentColor\" d=\"M16 10a6 6 0 1 0 6 6a6 6 0 0 0-6-6m0 10a4 4 0 1 1 4-4a4 4 0 0 1-4 4\"/>"},"view-off":{"body":"<path fill=\"currentColor\" d=\"m5.24 22.51l1.43-1.42A14.06 14.06 0 0 1 3.07 16C5.1 10.93 10.7 7 16 7a12.4 12.4 0 0 1 4 .72l1.55-1.56A14.7 14.7 0 0 0 16 5A16.69 16.69 0 0 0 1.06 15.66a1 1 0 0 0 0 .68a16 16 0 0 0 4.18 6.17\"/><path fill=\"currentColor\" d=\"M12 15.73a4 4 0 0 1 3.7-3.7l1.81-1.82a6 6 0 0 0-7.33 7.33Zm18.94-.07a16.4 16.4 0 0 0-5.74-7.44L30 3.41L28.59 2L2 28.59L3.41 30l5.1-5.1A15.3 15.3 0 0 0 16 27a16.69 16.69 0 0 0 14.94-10.66a1 1 0 0 0 0-.68M20 16a4 4 0 0 1-6 3.44L19.44 14a4 4 0 0 1 .56 2m-4 9a13.05 13.05 0 0 1-6-1.58l2.54-2.54a6 6 0 0 0 8.35-8.35l2.87-2.87A14.54 14.54 0 0 1 28.93 16C26.9 21.07 21.3 25 16 25\"/>"},"warning-alt":{"body":"<path fill=\"currentColor\" d=\"M16 23a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 16 23m-1-11h2v9h-2z\"/><path fill=\"currentColor\" d=\"M29 30H3a1 1 0 0 1-.887-1.461l13-25a1 1 0 0 1 1.774 0l13 25A1 1 0 0 1 29 30M4.65 28h22.7l.001-.003L16.002 6.17h-.004L4.648 27.997Z\"/>"}},"lastModified":1789034045,"aliases":{"software-resource-resource":{"parent":"software-resource-reference"}},"width":32,"height":32},
6
+ {"prefix":"fluent","icons":{"text-paragraph-direction-left-16-regular":{"body":"<path fill=\"currentColor\" d=\"M9 3a2.5 2.5 0 0 0 0 5h1V3zm2 0v10.5a.5.5 0 0 1-1 0V9H9a3.5 3.5 0 1 1 0-7h4.5a.5.5 0 0 1 0 1H13v10.5a.5.5 0 0 1-1 0V3zM3.854 6.146a.5.5 0 0 1 0 .708L2.707 8l1.147 1.146a.5.5 0 1 1-.708.708l-1.5-1.5a.5.5 0 0 1 0-.708l1.5-1.5a.5.5 0 0 1 .708 0\"/>","width":16,"height":16},"text-paragraph-direction-right-16-regular":{"body":"<path fill=\"currentColor\" d=\"M9 3a2.5 2.5 0 0 0 0 5h1V3zm2 0v10.5a.5.5 0 0 1-1 0V9H9a3.5 3.5 0 1 1 0-7h4.5a.5.5 0 0 1 0 1H13v10.5a.5.5 0 0 1-1 0V3zM2.146 6.146a.5.5 0 0 1 .708 0l1.5 1.5a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708-.708L3.293 8L2.146 6.854a.5.5 0 0 1 0-.708\"/>","width":16,"height":16}},"lastModified":1789279072,"width":20,"height":20},
7
7
  {"prefix":"mdi","icons":{"drag-horizontal-variant":{"body":"<path fill=\"currentColor\" d=\"M21 11H3V9h18zm0 2H3v2h18z\"/>"},"drag-vertical-variant":{"body":"<path fill=\"currentColor\" d=\"M11 21H9V3h2zm4-18h-2v18h2z\"/>"},"tailwind":{"body":"<path fill=\"currentColor\" d=\"M12 6c-2.67 0-4.33 1.33-5 4c1-1.33 2.17-1.83 3.5-1.5c.76.19 1.31.74 1.91 1.35c.98 1 2.09 2.15 4.59 2.15c2.67 0 4.33-1.33 5-4c-1 1.33-2.17 1.83-3.5 1.5c-.76-.19-1.3-.74-1.91-1.35C15.61 7.15 14.5 6 12 6m-5 6c-2.67 0-4.33 1.33-5 4c1-1.33 2.17-1.83 3.5-1.5c.76.19 1.3.74 1.91 1.35C8.39 16.85 9.5 18 12 18c2.67 0 4.33-1.33 5-4c-1 1.33-2.17 1.83-3.5 1.5c-.76-.19-1.3-.74-1.91-1.35C10.61 13.15 9.5 12 7 12\"/>"}},"lastModified":1737398331,"width":24,"height":24},
8
8
  {"prefix":"ri","icons":{"add-line":{"body":"<path fill=\"currentColor\" d=\"M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z\"/>"},"subtract-line":{"body":"<path fill=\"currentColor\" d=\"M5 11v2h14v-2z\"/>"}},"lastModified":1770712905,"width":24,"height":24},
9
9
  ]
@@ -11,7 +11,7 @@ export interface KeyboardShortcutOptions {
11
11
  event?: 'keyup' | 'keydown' | 'keypress'
12
12
  }
13
13
 
14
- const modifiers: { [i: string]: { key: string, pressed: boolean } } = {
14
+ const modifiers = {
15
15
  ctrl: { key: 'Control', pressed: false },
16
16
  alt: { key: 'Alt', pressed: false },
17
17
  shift: { key: 'Shift', pressed: false },
@@ -24,8 +24,7 @@ const trackedWindows = shallowRef<Window[]>([])
24
24
 
25
25
  function bindTracking(target: Window) {
26
26
  const onKeydown = (event: KeyboardEvent) => {
27
- for (const i in modifiers) {
28
- const mod = modifiers[i]
27
+ for (const mod of Object.values(modifiers)) {
29
28
  if (mod.key === event.key) {
30
29
  mod.pressed = true
31
30
  return
@@ -36,8 +35,7 @@ function bindTracking(target: Window) {
36
35
  const onKeyup = (event: KeyboardEvent) => {
37
36
  requestAnimationFrame(() => {
38
37
  pressedKeys.clear()
39
- for (const i in modifiers) {
40
- const mod = modifiers[i]
38
+ for (const mod of Object.values(modifiers)) {
41
39
  if (mod.key === event.key) {
42
40
  mod.pressed = false
43
41
  break
@@ -47,8 +45,8 @@ function bindTracking(target: Window) {
47
45
  }
48
46
  const onBlur = () => {
49
47
  pressedKeys.clear()
50
- for (const i in modifiers) {
51
- modifiers[i].pressed = false
48
+ for (const mod of Object.values(modifiers)) {
49
+ mod.pressed = false
52
50
  }
53
51
  }
54
52
  target.addEventListener('keydown', onKeydown)
@@ -108,10 +106,8 @@ function isMatchingCombination(combination: string): boolean {
108
106
  // `split` always yields at least one element, so this is unreachable for any
109
107
  // real combination — an empty or blank one matches nothing, which is right.
110
108
  if (!targetKey) return false
111
- for (const mod in modifiers) {
112
- const containsMod = splitted.includes(mod)
113
- const isPressed = modifiers[mod].pressed
114
- if (containsMod !== isPressed) {
109
+ for (const [name, mod] of Object.entries(modifiers)) {
110
+ if (splitted.includes(name) !== mod.pressed) {
115
111
  return false
116
112
  }
117
113
  }
@@ -28,7 +28,7 @@ export function mapFile(file: StoryFile, existingFile?: StoryFile): StoryFile {
28
28
  }
29
29
  }
30
30
  else if (key !== 'component') {
31
- result[key] = file[key]
31
+ Reflect.set(result, key, Reflect.get(file, key))
32
32
  }
33
33
  }
34
34
  }
@@ -58,7 +58,7 @@ export function mapVariant(variant: Variant, existingVariant?: Variant): Variant
58
58
  result = existingVariant
59
59
  for (const key in variant) {
60
60
  if (!copiedFromExistingVariant.includes(key)) {
61
- result[key] = variant[key]
61
+ Reflect.set(result, key, Reflect.get(variant, key))
62
62
  }
63
63
  }
64
64
  }