{"_id":"@adesin-fr/vue-gantt-timeline","_rev":"5-662f7234b2ae46e4543f5982e0988511","name":"@adesin-fr/vue-gantt-timeline","dist-tags":{"latest":"2026.40.1"},"versions":{"2026.37.1":{"name":"@adesin-fr/vue-gantt-timeline","version":"2026.37.1","keywords":["vue","vue3","gantt","timeline","planning","scheduler"],"license":"MIT","_id":"@adesin-fr/vue-gantt-timeline@2026.37.1","maintainers":[{"name":"adesin-fr","email":"ludovic@adesin.fr"}],"homepage":"https://github.com/adesin-fr/vue-gantt-timeline#readme","bugs":{"url":"https://github.com/adesin-fr/vue-gantt-timeline/issues"},"dist":{"shasum":"35add58803c0bea18c8849f037c792b0424ea53b","tarball":"https://registry.npmjs.org/@adesin-fr/vue-gantt-timeline/-/vue-gantt-timeline-2026.37.1.tgz","fileCount":6,"integrity":"sha512-spAqQWxStU64j49HCeuBziD7hzMPlXYQd3RdnopJuNlZ1W6qM5vIFE95IcOWhFeiHGnF7MZEMS6LkgeU88bhpA==","signatures":[{"sig":"MEUCIDGUreR051a2AsXeFaZnOF1mCJh9r4xH8EHexNsWR82nAiEAxyN1ACpvzQDkuO2A+qlNI2eTuAFlsjWE/CGibd7eGq4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71290},"main":"./dist/vue-gantt-timeline.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/vue-gantt-timeline.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/vue-gantt-timeline.js","require":"./dist/vue-gantt-timeline.umd.cjs"},"./style.css":"./dist/vue-gantt-timeline.css"},"gitHead":"26617b88dc6940eae089d91ecd1a42e5b2e066f6","scripts":{"dev":"vite","build":"vue-tsc --noEmit && vite build --mode lib","preview":"vite preview","build:demo":"vite build","type-check":"vue-tsc --noEmit","build:watch":"vite build --mode lib --watch"},"_npmUser":{"name":"adesin-fr","email":"ludovic@adesin.fr"},"repository":{"url":"git+https://github.com/adesin-fr/vue-gantt-timeline.git","type":"git"},"_npmVersion":"10.9.4","description":"Composant Vue 3 de planning / gantt : groupes, éléments déplaçables, empilement automatique, rendu personnalisable.","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^7.0.0","vue-tsc":"^2.1.10","typescript":"^5.6.0","@types/node":"^26.5.0","vite-plugin-dts":"^4.5.0","@vitejs/plugin-vue":"^6.0.0"},"peerDependencies":{"vue":"^3.4.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-gantt-timeline_2026.37.1_1788794154057_0.511346254278404","host":"s3://npm-registry-packages-npm-production"}},"2026.37.2":{"name":"@adesin-fr/vue-gantt-timeline","version":"2026.37.2","keywords":["vue","vue3","gantt","timeline","planning","scheduler"],"license":"MIT","_id":"@adesin-fr/vue-gantt-timeline@2026.37.2","maintainers":[{"name":"adesin-fr","email":"ludovic@adesin.fr"}],"homepage":"https://github.com/adesin-fr/vue-gantt-timeline#readme","bugs":{"url":"https://github.com/adesin-fr/vue-gantt-timeline/issues"},"dist":{"shasum":"3886731fdb6311dc8d992ba7d64548e947db0c27","tarball":"https://registry.npmjs.org/@adesin-fr/vue-gantt-timeline/-/vue-gantt-timeline-2026.37.2.tgz","fileCount":6,"integrity":"sha512-Dnby9dcFVG/DU56MuEU30IJ0TNVNDxtRcs3Dl2sgLbXNxKnA8Wky3XnFn/iifMCiDUci0Sp5QDfSGxBj2paNgw==","signatures":[{"sig":"MEUCIEJcaLPtRGj83CwrJhhflNUz0kH7JN5yFPS3YZKlUDdnAiEAxRlU6aTY8N6drfbvu43T8V9aFaBK5JzpYlWB8C2aWNY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72115},"main":"./dist/vue-gantt-timeline.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/vue-gantt-timeline.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/vue-gantt-timeline.js","require":"./dist/vue-gantt-timeline.umd.cjs"},"./style.css":"./dist/vue-gantt-timeline.css"},"gitHead":"c36f9b609a9ff301e33174b4461a4e24ae2a5139","scripts":{"dev":"vite","build":"vue-tsc --noEmit && vite build --mode lib","preview":"vite preview","build:demo":"vite build","type-check":"vue-tsc --noEmit","build:watch":"vite build --mode lib --watch"},"_npmUser":{"name":"adesin-fr","email":"ludovic@adesin.fr"},"repository":{"url":"git+https://github.com/adesin-fr/vue-gantt-timeline.git","type":"git"},"_npmVersion":"10.9.4","description":"Composant Vue 3 de planning / gantt : groupes, éléments déplaçables, empilement automatique, rendu personnalisable.","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^7.0.0","vue-tsc":"^2.1.10","typescript":"^5.6.0","@types/node":"^26.5.0","vite-plugin-dts":"^4.5.0","@vitejs/plugin-vue":"^6.0.0"},"peerDependencies":{"vue":"^3.4.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-gantt-timeline_2026.37.2_1788795682576_0.20443246187436093","host":"s3://npm-registry-packages-npm-production"}},"2026.40.1":{"name":"@adesin-fr/vue-gantt-timeline","version":"2026.40.1","keywords":["vue","vue3","gantt","timeline","planning","scheduler"],"license":"MIT","_id":"@adesin-fr/vue-gantt-timeline@2026.40.1","maintainers":[{"name":"adesin-fr","email":"ludovic@adesin.fr"}],"homepage":"https://github.com/adesin-fr/vue-gantt-timeline#readme","bugs":{"url":"https://github.com/adesin-fr/vue-gantt-timeline/issues"},"dist":{"shasum":"7db7194be585b80426842afd218842044314be71","tarball":"https://registry.npmjs.org/@adesin-fr/vue-gantt-timeline/-/vue-gantt-timeline-2026.40.1.tgz","fileCount":6,"integrity":"sha512-7a1vh7FMGU2DFih1SXzmIIwIgCM1F93UAtFXqyQRuzMdzWPVm9xD9aeRS+T41EI135ohnzcNqbml22AohknZ0g==","signatures":[{"sig":"MEQCIBhPossoLknoDlzjzE31GCwjRbHk3rXcFC/d26QIP/5vAiBuUoeNpqGp19Re/JZtJdZX7meOc/JUkN1Vqj2qB5MIDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDD+/oEmygDKe/jjfFZ2+trGKkMb4em15NYJ/21V8e/IgIgWTYjxiwjjfhoM1oFEwqcsahTuRMc17x15SSs0/8U8N8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85154},"main":"./dist/vue-gantt-timeline.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/vue-gantt-timeline.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/vue-gantt-timeline.js","require":"./dist/vue-gantt-timeline.umd.cjs"},"./style.css":"./dist/vue-gantt-timeline.css"},"gitHead":"a0cc9e9ad9fb120ead5715650fc58c79fa1503f6","scripts":{"dev":"vite","build":"vue-tsc --noEmit && vite build --mode lib","preview":"vite preview","build:demo":"vite build","type-check":"vue-tsc --noEmit","build:watch":"vite build --mode lib --watch"},"_npmUser":{"name":"adesin-fr","email":"ludovic@adesin.fr"},"repository":{"url":"git+https://github.com/adesin-fr/vue-gantt-timeline.git","type":"git"},"_npmVersion":"10.9.8","description":"Composant Vue 3 de planning / gantt : groupes, éléments déplaçables, empilement automatique, rendu personnalisable.","directories":{},"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^7.0.0","vue-tsc":"^2.1.10","typescript":"^5.6.0","@types/node":"^26.5.0","vite-plugin-dts":"^4.5.0","@vitejs/plugin-vue":"^6.0.0"},"peerDependencies":{"vue":"^3.4.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-gantt-timeline_2026.40.1_1791134093045_0.6671354191505374","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-09-07T15:15:53.872Z","modified":"2026-10-05T13:19:02.247Z","2026.37.1":"2026-09-07T15:15:54.238Z","2026.37.2":"2026-09-07T15:41:22.718Z","2026.40.1":"2026-10-04T17:14:53.137Z"},"bugs":{"url":"https://github.com/adesin-fr/vue-gantt-timeline/issues"},"license":"MIT","homepage":"https://github.com/adesin-fr/vue-gantt-timeline#readme","keywords":["vue","vue3","gantt","timeline","planning","scheduler"],"repository":{"url":"git+https://github.com/adesin-fr/vue-gantt-timeline.git","type":"git"},"description":"Composant Vue 3 de planning / gantt : groupes, éléments déplaçables, empilement automatique, rendu personnalisable.","maintainers":[{"email":"arthur@adesin.fr","name":"arthur-gosset"},{"email":"ludovic@adesin.fr","name":"ludovic-lemarinel"}],"readme":"# vue-gantt-timeline\n\nComposant Vue 3 de planning / gantt : une colonne de groupes à gauche, une fenêtre de dates\nfigée à droite, des blocs déplaçables et empilés automatiquement.\n\n- rendu strictement limité à la fenêtre `[start, end]` : aucun bloc « fantôme » hors plage ;\n- empilement au plus juste : un bloc est posé sur la première ligne virtuelle libre, une nouvelle\n  ligne n'est créée que si aucune ne peut l'accueillir ;\n- déplacement dans le temps et d'un groupe à l'autre, redimensionnement par les bords, avec\n  évènements émis à chaque fois ;\n- rendu des blocs par slot ou par fonction ;\n- virtualisation verticale : seules les lignes visibles sont montées (centaines de groupes OK) ;\n- aucune dépendance runtime en dehors de Vue.\n\nLa fenêtre affichée est pilotée par les props `start` / `end`. Deux gestes optionnels la font\nvarier, désactivés par défaut :\n\n- `pannable` — clic-glisser dans le vide pour faire défiler la plage de dates (le mouvement\n  vertical fait défiler les groupes en même temps) ;\n- `zoomable` — pincement (gestes WebKit ou deux doigts) et molette + <kbd>ctrl</kbd>\n  (<kbd>cmd</kbd> sur macOS), avec zoom centré sur le curseur.\n\nDans les deux cas le composant émet `range-change` et `update:start` / `update:end` : la\nfenêtre se pilote donc au choix par `v-model:start` / `v-model:end` ou à la main. Une molette\nsans modificateur conserve son rôle de défilement vertical.\n\n## Installation\n\n```bash\nnpm install @adesin-fr/vue-gantt-timeline\n```\n\n```js\nimport { GanttTimeline } from '@adesin-fr/vue-gantt-timeline'\nimport '@adesin-fr/vue-gantt-timeline/style.css'\n```\n\n## Utilisation\n\n```vue\n<GanttTimeline\n    :groups=\"[{ id: 1, label: 'Atelier' }]\"\n    :items=\"[{ id: 'a', group: 1, start: '2026-09-07 08:00', end: '2026-09-07 12:00', content: 'OT 1234' }]\"\n    :start=\"windowStart\"\n    :end=\"windowEnd\"\n    :editable=\"{ updateTime: true, updateGroup: true }\"\n    @item-move=\"onMove\"\n    @item-resize=\"onMove\"\n>\n    <template #item=\"{ item }\">\n        <strong>{{ item.content }}</strong>\n    </template>\n</GanttTimeline>\n```\n\nLe composant ne modifie jamais `items` : à réception de `item-move` / `item-resize`, c'est au\nparent d'appliquer (ou de refuser) le nouveau positionnement. Tant qu'il ne le fait pas, le bloc\nrevient à sa position d'origine.\n\n### Props\n\n| Prop | Défaut | Rôle |\n| --- | --- | --- |\n| `groups` | — | lignes du planning (`{ id, label?, className?, style?, minHeight? }`) |\n| `items` | — | blocs (`{ id, group, start, end?, content?, title?, className?, style?, type?, editable? }`) |\n| `start`, `end` | — | fenêtre affichée (`Date`, timestamp, ISO ou `YYYY-MM-DD HH:mm:ss`) |\n| `editable` | `false` | `boolean` ou `{ updateTime, updateGroup }`, surchargeable par bloc |\n| `snap` | `900000` | arrondi pendant un déplacement : ms ou `(date, kind) => date` |\n| `minDuration` | `300000` | durée minimale d'un bloc au redimensionnement |\n| `stack` | `true` | empilement des blocs qui se chevauchent |\n| `order` | — | tri des blocs d'un groupe avant empilement |\n| `itemRenderer` | — | `(item, group) => string` (HTML) si le slot `item` n'est pas utilisé |\n| `groupWidth` | `180` | largeur de la colonne des groupes |\n| `laneHeight` / `laneGap` / `rowPadding` / `minRowHeight` | `26` / `2` / `4` / `40` | métriques verticales |\n| `minItemWidth` / `itemMargin` | `6` / `2` | largeur minimale d'un bloc, écart de collision |\n| `locale` / `weekStart` | navigateur / `1` | axe temporel |\n| `timeScale` | — | impose l'échelle de l'axe, ex. `{ unit: 'day', step: 1 }` (sinon déduite de la largeur) |\n| `hiddenTimeRanges` | `[]` | plages horaires récurrentes retirées de l'axe, ex. `[{ start: '18:00', end: '08:00' }]` (nuit) ou `[{ start: '00:00', end: '24:00', days: [0, 6] }]` (week-end). Voir ci-dessous |\n| `showCurrentTime` | `true` | trait de l'heure courante |\n| `overscan` | `3` | lignes rendues hors zone visible |\n| `pannable` | `false` | défilement de la plage au clic-glisser dans le vide |\n| `zoomable` | `false` | zoom au pincement et à la molette + ctrl/cmd |\n| `zoomMin` / `zoomMax` | `600000` / 5 ans | amplitude minimale et maximale de la fenêtre au zoom |\n| `minDate` / `maxDate` | — | bornes au-delà desquelles la fenêtre ne peut pas aller |\n\n### Évènements\n\n| Évènement | Payload |\n| --- | --- |\n| `item-drag` | position provisoire, émise pendant le déplacement |\n| `item-move` | déplacement validé (temps et/ou groupe) |\n| `item-resize` | redimensionnement validé |\n| `item-click`, `item-dblclick`, `item-contextmenu` | `{ item, group, event }` |\n| `background-click`, `background-dblclick` | `{ group, time, event }` — création de bloc |\n| `group-click`, `group-dblclick` | `{ group, event }` |\n| `range-change` | `{ start, end, reason: 'pan' \\| 'zoom' }` |\n| `update:start`, `update:end` | nouvelle borne (`v-model:start` / `v-model:end`) |\n\n`item-drag` / `item-move` / `item-resize` reçoivent\n`{ item, kind, start, end, group, previousStart, previousEnd, previousGroup, groupChanged }`.\n\nLe composant expose aussi `setWindow(start, end)`, `scrollToGroup(id)`, `timeToX`, `xToTime`.\n\n### Slots\n\n- `item` — `{ item, group, placed }`, contenu d'un bloc ;\n- `group` — `{ group, row }`, libellé d'une ligne ;\n- `corner` — coin haut-gauche ;\n- `empty` — aucun groupe.\n\n### Personnalisation\n\nLes couleurs passent par des variables CSS sur `.vgt` (`--vgt-item-bg`, `--vgt-border`,\n`--vgt-now`, …) ; `className` et `style` sur un bloc ou un groupe restent prioritaires.\n\n## Développement\n\n```bash\nnpm run dev          # playground (demo/App.vue)\nnpm run build        # vérification des types + build de la lib dans dist/\nnpm run build:watch  # rebuild à chaud, pratique avec un `npm link`\n```\n\n### Lien local vers une application\n\n```bash\ncd /chemin/vers/ganttTimeline && npm link\ncd /chemin/vers/application && npm link @adesin-fr/vue-gantt-timeline\n```\n\nCôté application Vite, dédupliquer Vue (le paquet lié embarque le sien) :\n\n```js\nresolve: { dedupe: ['vue'] },\nserver: { fs: { allow: ['..'] } },\noptimizeDeps: { exclude: ['@adesin-fr/vue-gantt-timeline'] },\n```\n\n## Masquer des plages horaires\n\n`hiddenTimeRanges` reçoit un tableau de `{ start, end, days? }` (`HH:mm`, `24:00` accepté pour `end`).\nSi `start` est après `end`, la plage passe minuit et appartient au jour où elle commence. `days`\n(0 = dimanche … 6 = samedi) restreint la plage à certains jours de début.\n\nLes plages masquées ne prennent aucune largeur : le temps visible est mis bout à bout, un trait\npointillé marque chaque coupure, et les blocs entièrement masqués ne sont pas rendus. Un bloc à cheval\nsur une coupure est affiché d'un seul tenant. `zoomMin` / `zoomMax` s'appliquent à la durée *visible*.\n`start` / `end` (et `range-change`) restent de vrais instants.\n","readmeFilename":"README.md"}