@feugene/granularity-dashboard

Widget grid for the @feugene/granularity design system — drag, resize, breakpoints and layout persistence, zero dependencies.
2,068 1
Install
npm install @feugene/granularity-dashboard
Latest Version:2.0.2
Vue:3
License:LicenseRef-Granularity-EUC-1.1
Last Updated:Oct 22, 2026
Links: GitHub  ·  npm
Maintainer: efureev

@feugene/granularity-dashboard

Сетка виджетов для дизайн-системы @feugene/granularity: перетаскивание, растягивание, брейкпоинты и раскладка, которая переживает перезагрузку. Без единой зависимости — коллизии, компактизация и геометрия сетки это арифметика над целыми числами.

yarn add @feugene/granularity-dashboard

Что внутри

Компонент Зачем
GrDashboard сетка: раскладка, брейкпоинты, режимы просмотра и редактирования
GrDashboardItem виджет на сетке поверх GrCard ядра
GrDashboardToolbar переключатель режима и сброс раскладки
GrDashboardPalette каталог виджетов, которые можно добавить
useDashboardLayout сохранение и восстановление раскладки
./layout чистая арифметика раскладки: ни Vue, ни DOM

Как это выглядит

<script setup lang="ts">
import { localStorageLayoutStorage, useDashboardLayout } from '@feugene/granularity-dashboard'
import { GrDashboard } from '@feugene/granularity-dashboard/components/GrDashboard'
import { GrDashboardItem } from '@feugene/granularity-dashboard/components/GrDashboardItem'
import { GrDashboardToolbar } from '@feugene/granularity-dashboard/components/GrDashboardToolbar'
import { ref } from 'vue'

const mode = ref<'view' | 'edit'>('view')

const { layout, reset } = useDashboardLayout({
  initial: {
    lg: [
      { id: 'revenue', x: 0, y: 0, w: 8, h: 3 },
      { id: 'funnel', x: 8, y: 0, w: 4, h: 3, minW: 3 },
    ],
  },
  storage: localStorageLayoutStorage(),
  key: 'analytics',
})
</script>

<template>
  <GrDashboardToolbar v-model:mode="mode" resettable @reset="reset" />

  <GrDashboard v-model:layout="layout" :mode="mode">
    <GrDashboardItem item-id="revenue" title="Выручка">
      <RevenueChart />
    </GrDashboardItem>
    <GrDashboardItem item-id="funnel" title="Воронка" :min-w="3">
      <FunnelChart />
    </GrDashboardItem>
  </GrDashboard>
</template>

Подключение

CSS

Пакет перечисляется именем, рядом с ядром: granum читает dist/granum.manifest.json каждого через exports, а не сканирует node_modules.

// granum.config.ts
import { defineGranumConfig } from '@feugene/granum/vite'
import { windEngine } from '@feugene/granum-engine-wind'

export default defineGranumConfig({
  engine: windEngine(),
  providers: ['@feugene/granularity', '@feugene/granularity-dashboard'],
  components: ['@feugene/granularity-dashboard:GrDashboard'],
})

Классы компонентов написаны против словаря unocss/preset-wind3+granum@66. Движок другого диалекта заставит granum сообщить provider-dialect-mismatch и перечислить отброшенные классы, а не отрисовать сетку наполовину.

Авто-импорт

Один резолвер на ядро и все спутники: GranularityResolver() (@feugene/unplugin-granularity >=1.1.0) находит пакет в package.json приложения и читает его exports. Собственный GranularityDashboardResolver() остаётся для уже написанных конфигов; порядок не важен.

import { GranularityResolver } from '@feugene/unplugin-granularity'

Components({ resolvers: GranularityResolver() })

Переводы

import { GRANULARITY_I18N_BLOCK, en as coreEn, ru as coreRu } from '@feugene/granularity/i18n'
import { GR_DASHBOARD_I18N_BLOCK, en, ru } from '@feugene/granularity-dashboard/i18n'

const i18n = createFintI18n({ locale: 'ru', loaders: [coreEn, coreRu, en, ru] })
i18n.registerBlocks([GRANULARITY_I18N_BLOCK, GR_DASHBOARD_I18N_BLOCK])

Без адаптера компоненты показывают английский текст, а не ключи.

Вес гранулярного импорта

Что берут gzip от бареля
весь пакет из корня 25.7 kB 100 %
самый лёгкий компонент — GrDashboardToolbar 1.7 kB 6 %
медианный компонент — GrDashboardItemSettings 5.2 kB 20 %
5 самых тяжёлых вместе 22.3 kB 87 %

Числа не складываются: общий код посчитан в каждой строке заново, а платится один раз — поэтому набор компонентов и показан объединением, а не суммой. Это верхняя граница: gzip всего, что подпуть тянет из dist, а бандлер приложения трясёт дальше и минифицирует повторно.

Вес каждого компонента — docs/entry-sizes.md.

Документация

Файл О чём
docs/model.md модель раскладки, компактизация, брейкпоинты, сохранение
docs/keyboard.md карта клавиш
docs/a11y.md роли, имена, что произносится
docs/theming.md токены пакета
docs/ssr.md серверный рендер

Границы

Пакет не рисует содержимое виджета и не ходит за данными — это дело приложения. Графики — @feugene/granularity-charts, время — @feugene/granularity-chrono. Конструктором отчётов пакет не является.

Related Packages

@feugene/granularity-chrono

Calendar, date and time components for the @feugene/granularity design system —...

2,790 1
@feugene/granularity-charts

Charts for the @feugene/granularity design system — own SVG, zero dependencies,...

3,017 1
@feugene/granularity-forms-schema

Schema-driven forms for the @feugene/granularity design system — zod and JSON Sc...

2,546 1
@feugene/granularity-code

Code surfaces for @feugene/granularity: view, edit and diff — the viewer and the...

1,191 1
vue-drag-component-plus

拖拽卡片布局组件 vue3版组件

1,098 0

Version History

Version Released Vue License
2.0.2 ^3.5.0 LicenseRef-Granularity-EUC-1.1
2.0.1 ^3.5.0 LicenseRef-Granularity-EUC-1.1
2.0.0 ^3.5.0 LicenseRef-Granularity-EUC-1.1
1.1.0 ^3.5.0 LicenseRef-Granularity-EUC-1.1
1.0.4 ^3.5.0 LicenseRef-Granularity-EUC-1.1