@vit-foundation/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +129 -0
  3. package/dist/components/jobs/JobList.svelte +88 -0
  4. package/dist/components/jobs/JobList.svelte.d.ts +18 -0
  5. package/dist/components/jobs/index.d.ts +2 -0
  6. package/dist/components/jobs/index.js +1 -0
  7. package/dist/components/layout/Footer.svelte +79 -0
  8. package/dist/components/layout/Footer.svelte.d.ts +12 -0
  9. package/dist/components/layout/Nav.svelte +229 -0
  10. package/dist/components/layout/Nav.svelte.d.ts +18 -0
  11. package/dist/components/layout/PageShell.svelte +107 -0
  12. package/dist/components/layout/PageShell.svelte.d.ts +42 -0
  13. package/dist/components/layout/index.d.ts +3 -0
  14. package/dist/components/layout/index.js +3 -0
  15. package/dist/components/projects/ProjectCard.svelte +107 -0
  16. package/dist/components/projects/ProjectCard.svelte.d.ts +17 -0
  17. package/dist/components/projects/index.d.ts +2 -0
  18. package/dist/components/projects/index.js +1 -0
  19. package/dist/components/team/CollaboratorList.svelte +37 -0
  20. package/dist/components/team/CollaboratorList.svelte.d.ts +7 -0
  21. package/dist/components/team/TeamMemberCard.svelte +78 -0
  22. package/dist/components/team/TeamMemberCard.svelte.d.ts +21 -0
  23. package/dist/components/team/index.d.ts +3 -0
  24. package/dist/components/team/index.js +2 -0
  25. package/dist/components/timeline/Timeline.svelte +116 -0
  26. package/dist/components/timeline/Timeline.svelte.d.ts +12 -0
  27. package/dist/components/timeline/TimelineMilestone.svelte +127 -0
  28. package/dist/components/timeline/TimelineMilestone.svelte.d.ts +15 -0
  29. package/dist/components/timeline/index.d.ts +3 -0
  30. package/dist/components/timeline/index.js +2 -0
  31. package/dist/components/ui/Button.svelte +53 -0
  32. package/dist/components/ui/Button.svelte.d.ts +21 -0
  33. package/dist/components/ui/CardMedia.svelte +23 -0
  34. package/dist/components/ui/CardMedia.svelte.d.ts +11 -0
  35. package/dist/components/ui/CardTitle.svelte +28 -0
  36. package/dist/components/ui/CardTitle.svelte.d.ts +8 -0
  37. package/dist/components/ui/CopyIntro.svelte +40 -0
  38. package/dist/components/ui/CopyIntro.svelte.d.ts +24 -0
  39. package/dist/components/ui/DateText.svelte +43 -0
  40. package/dist/components/ui/DateText.svelte.d.ts +28 -0
  41. package/dist/components/ui/DecorShapes.svelte +36 -0
  42. package/dist/components/ui/DecorShapes.svelte.d.ts +7 -0
  43. package/dist/components/ui/Field.svelte +89 -0
  44. package/dist/components/ui/Field.svelte.d.ts +55 -0
  45. package/dist/components/ui/FilterChips.svelte +43 -0
  46. package/dist/components/ui/FilterChips.svelte.d.ts +15 -0
  47. package/dist/components/ui/FormErrorFeedback.svelte +55 -0
  48. package/dist/components/ui/FormErrorFeedback.svelte.d.ts +33 -0
  49. package/dist/components/ui/FormFeedback.svelte +65 -0
  50. package/dist/components/ui/FormFeedback.svelte.d.ts +30 -0
  51. package/dist/components/ui/FormResultSlot.svelte +33 -0
  52. package/dist/components/ui/FormResultSlot.svelte.d.ts +26 -0
  53. package/dist/components/ui/GhostButton.svelte +46 -0
  54. package/dist/components/ui/GhostButton.svelte.d.ts +10 -0
  55. package/dist/components/ui/Link.svelte +30 -0
  56. package/dist/components/ui/Link.svelte.d.ts +21 -0
  57. package/dist/components/ui/Pagination.svelte +77 -0
  58. package/dist/components/ui/Pagination.svelte.d.ts +18 -0
  59. package/dist/components/ui/RichText.svelte +160 -0
  60. package/dist/components/ui/RichText.svelte.d.ts +18 -0
  61. package/dist/components/ui/SearchInput.svelte +90 -0
  62. package/dist/components/ui/SearchInput.svelte.d.ts +13 -0
  63. package/dist/components/ui/ShareRow.svelte +95 -0
  64. package/dist/components/ui/ShareRow.svelte.d.ts +19 -0
  65. package/dist/components/ui/index.d.ts +17 -0
  66. package/dist/components/ui/index.js +17 -0
  67. package/dist/components/weeklies/SortSelect.svelte +42 -0
  68. package/dist/components/weeklies/SortSelect.svelte.d.ts +8 -0
  69. package/dist/components/weeklies/WeeklieCard.svelte +82 -0
  70. package/dist/components/weeklies/WeeklieCard.svelte.d.ts +15 -0
  71. package/dist/components/weeklies/index.d.ts +3 -0
  72. package/dist/components/weeklies/index.js +2 -0
  73. package/dist/config/UiProvider.svelte +21 -0
  74. package/dist/config/UiProvider.svelte.d.ts +14 -0
  75. package/dist/config/context.d.ts +17 -0
  76. package/dist/config/context.js +47 -0
  77. package/dist/config/index.d.ts +5 -0
  78. package/dist/config/index.js +4 -0
  79. package/dist/config/messages.d.ts +7 -0
  80. package/dist/config/messages.js +38 -0
  81. package/dist/config/types.d.ts +99 -0
  82. package/dist/config/types.js +9 -0
  83. package/dist/content/index.d.ts +3 -0
  84. package/dist/content/index.js +1 -0
  85. package/dist/content/richtext.d.ts +10 -0
  86. package/dist/content/richtext.js +14 -0
  87. package/dist/content/types.d.ts +71 -0
  88. package/dist/content/types.js +6 -0
  89. package/dist/edit/Editable.svelte +197 -0
  90. package/dist/edit/Editable.svelte.d.ts +52 -0
  91. package/dist/edit/context.d.ts +10 -0
  92. package/dist/edit/context.js +15 -0
  93. package/dist/edit/helpers.d.ts +18 -0
  94. package/dist/edit/helpers.js +14 -0
  95. package/dist/edit/index.d.ts +5 -0
  96. package/dist/edit/index.js +4 -0
  97. package/dist/edit/types.d.ts +64 -0
  98. package/dist/edit/types.js +4 -0
  99. package/dist/index.d.ts +13 -0
  100. package/dist/index.js +17 -0
  101. package/dist/styles/base.css +67 -0
  102. package/dist/styles/tokens.css +57 -0
  103. package/dist/utils/dates.d.ts +14 -0
  104. package/dist/utils/dates.js +34 -0
  105. package/dist/utils/milestones.d.ts +11 -0
  106. package/dist/utils/milestones.js +28 -0
  107. package/dist/utils/paths.d.ts +2 -0
  108. package/dist/utils/paths.js +4 -0
  109. package/package.json +139 -0
@@ -0,0 +1,64 @@
1
+ import type { Locale } from '../config/types.js';
2
+ /**
3
+ * The stored shape of one localized text column (`jsonb` keyed by locale).
4
+ * Catalan is canonical and required — the database enforces `content ? 'ca'`
5
+ * on every localized column, and this type states the same rule to writers.
6
+ */
7
+ export interface LocalizedText {
8
+ ca: string;
9
+ en?: string;
10
+ es?: string;
11
+ }
12
+ /** One locale's reading of a localized value, falling back to Catalan. */
13
+ export declare function localize(value: LocalizedText, locale: Locale): string;
14
+ /**
15
+ * The entities whose fields the components can mark editable. Names match
16
+ * the content tables so an adapter can route a save without a mapping layer.
17
+ */
18
+ export type EditableEntity = 'weeklies' | 'projects' | 'milestones' | 'team_members' | 'job_openings';
19
+ /**
20
+ * The identity of one editable string in the content model: either a page
21
+ * copy block (`page_content` row) or one localized field of a domain entity.
22
+ */
23
+ export type ContentRef = {
24
+ kind: 'page-copy';
25
+ page: string;
26
+ sectionKey: string;
27
+ } | {
28
+ kind: 'entity';
29
+ entity: EditableEntity;
30
+ id: string | number;
31
+ field: string;
32
+ };
33
+ /** What a component hands the adapter alongside the new value. */
34
+ export interface EditDescriptor {
35
+ ref: ContentRef;
36
+ /** The translation this save writes — one locale per save. */
37
+ locale: Locale;
38
+ /**
39
+ * 'text' commits on Enter and forbids newlines; 'multiline' commits on
40
+ * Cmd/Ctrl+Enter; 'richtext' is the block mini-format (RichText renders
41
+ * its own textarea editor for it).
42
+ */
43
+ format?: 'text' | 'multiline' | 'richtext';
44
+ /** Accessible name for the edit control, e.g. "Títol del weekly #12". */
45
+ label?: string;
46
+ }
47
+ /**
48
+ * What a consuming app plugs in to make the components writable. The package
49
+ * never talks to a database: `save` is the whole persistence contract.
50
+ *
51
+ * Implementations must:
52
+ * - back `isEditing` with reactive state (`$state`) — it gates every edit
53
+ * affordance live;
54
+ * - merge `{ [descriptor.locale]: value }` into the stored localized column
55
+ * rather than replacing it;
56
+ * - reject a save that would empty the canonical `ca` value (the database's
57
+ * `? 'ca'` check makes that a hard error anyway — fail it politely);
58
+ * - resolve when persisted, reject on failure (the editor keeps the draft
59
+ * and shows the error state).
60
+ */
61
+ export interface EditAdapter {
62
+ readonly isEditing: boolean;
63
+ save(descriptor: EditDescriptor, value: string): Promise<void>;
64
+ }
@@ -0,0 +1,4 @@
1
+ /** One locale's reading of a localized value, falling back to Catalan. */
2
+ export function localize(value, locale) {
3
+ return value[locale] || value.ca;
4
+ }
@@ -0,0 +1,13 @@
1
+ export * from './components/ui/index.js';
2
+ export * from './components/layout/index.js';
3
+ export * from './components/weeklies/index.js';
4
+ export * from './components/projects/index.js';
5
+ export * from './components/team/index.js';
6
+ export * from './components/timeline/index.js';
7
+ export * from './components/jobs/index.js';
8
+ export * from './config/index.js';
9
+ export * from './edit/index.js';
10
+ export * from './content/index.js';
11
+ export { formatDate, yearOf } from './utils/dates.js';
12
+ export { MILESTONE_CATEGORY_COLOR, milestoneCategoryLabel } from './utils/milestones.js';
13
+ export { isPathUnder } from './utils/paths.js';
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ // Components, by group.
2
+ export * from './components/ui/index.js';
3
+ export * from './components/layout/index.js';
4
+ export * from './components/weeklies/index.js';
5
+ export * from './components/projects/index.js';
6
+ export * from './components/team/index.js';
7
+ export * from './components/timeline/index.js';
8
+ export * from './components/jobs/index.js';
9
+ // App wiring: configuration context and the edit-mode contract.
10
+ export * from './config/index.js';
11
+ export * from './edit/index.js';
12
+ // Content shapes and the rich-text mini-format.
13
+ export * from './content/index.js';
14
+ // Utilities the components share with their host apps.
15
+ export { formatDate, yearOf } from './utils/dates.js';
16
+ export { MILESTONE_CATEGORY_COLOR, milestoneCategoryLabel } from './utils/milestones.js';
17
+ export { isPathUnder } from './utils/paths.js';
@@ -0,0 +1,67 @@
1
+ /* Utility classes the @vit-foundation/ui components rely on, plus the edit-mode
2
+ * affordance. Import once next to tokens.css:
3
+ *
4
+ * import '@vit-foundation/ui/tokens.css';
5
+ * import '@vit-foundation/ui/base.css';
6
+ *
7
+ * An app with its own global stylesheet that already defines these classes
8
+ * (the foundation website) can keep its copies and skip this file — the
9
+ * selectors and declarations here are the canonical spellings of the same
10
+ * rules. */
11
+
12
+ .visually-hidden {
13
+ position: absolute;
14
+ width: 1px;
15
+ height: 1px;
16
+ padding: 0;
17
+ margin: -1px;
18
+ overflow: hidden;
19
+ clip-path: inset(50%);
20
+ white-space: nowrap;
21
+ border: 0;
22
+ }
23
+
24
+ /* Centered page band: constrains content width with section padding.
25
+ * Layout (flex, alignment) stays with the component that adds the class. */
26
+ .band {
27
+ max-width: var(--content-max);
28
+ margin: 0 auto;
29
+ padding: var(--space-5) var(--space-3);
30
+ }
31
+
32
+ /* Compact variant for bars (site header). */
33
+ .band-bar {
34
+ max-width: var(--content-max);
35
+ margin: 0 auto;
36
+ padding: var(--space-3);
37
+ }
38
+
39
+ /* Form-control skin: one border token for every input, select, and textarea.
40
+ * Sizing (padding, widths) stays with the component that adds the class. */
41
+ .control {
42
+ border: 1px solid var(--color-axis);
43
+ border-radius: var(--radius);
44
+ background: var(--color-surface);
45
+ }
46
+
47
+ /* Edit-mode affordance. Global on purpose: the editable element is rendered
48
+ * by the consuming component's own markup (Editable hands it attributes
49
+ * through a snippet), which scoped styles inside Editable can never reach. */
50
+ [data-vit-editing] {
51
+ outline: 2px dashed var(--color-brand);
52
+ outline-offset: 3px;
53
+ border-radius: 2px;
54
+ cursor: text;
55
+ }
56
+
57
+ [data-vit-editing]:focus-visible {
58
+ outline-style: solid;
59
+ }
60
+
61
+ [data-vit-editing='saving'] {
62
+ opacity: 0.6;
63
+ }
64
+
65
+ [data-vit-editing='error'] {
66
+ outline-color: var(--series-8);
67
+ }
@@ -0,0 +1,57 @@
1
+ /* Fundació VIT design tokens. Series slots come from the validated
2
+ * fv-chart-style palette (light mode) — fixed order, never reassigned. */
3
+ :root {
4
+ /* Brand & wireframe hues */
5
+ --color-brand: #0899b1;
6
+ --color-brand-light: #5ac7d2;
7
+ --color-navy: #1f2a5e;
8
+ --color-orange: #eb6834;
9
+ --color-magenta: #e87ba4;
10
+ --color-cream: #f6f1e7;
11
+ --color-band-grey: #ececec;
12
+
13
+ /* Ink & surfaces */
14
+ --color-ink: #101418;
15
+ --color-ink-secondary: #475259;
16
+ --color-ink-muted: #7d868c;
17
+ --color-hairline: #e3e7e9;
18
+ --color-axis: #c5cbcf;
19
+ --color-surface: #ffffff;
20
+
21
+ /* Dataviz series — validated palette, fixed slot order (1 = brand teal) */
22
+ --series-1: #0899b1;
23
+ --series-2: #eb6834;
24
+ --series-3: #4a3aa7;
25
+ --series-4: #eda100;
26
+ --series-5: #e87ba4;
27
+ --series-6: #008300;
28
+ --series-7: #2a78d6;
29
+ --series-8: #e34948;
30
+
31
+ /* Typography */
32
+ --font-sans: system-ui, -apple-system, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
33
+ --text-sm: 0.875rem;
34
+ --text-base: 1rem;
35
+ --text-lg: 1.25rem;
36
+ --text-xl: 1.75rem;
37
+ --text-2xl: 2.25rem;
38
+ --text-hero: clamp(2.25rem, 5vw, 3.5rem);
39
+ --leading-tight: 1.15;
40
+ --leading-body: 1.6;
41
+
42
+ /* Spacing */
43
+ --space-1: 0.25rem;
44
+ --space-2: 0.5rem;
45
+ --space-3: 1rem;
46
+ --space-4: 1.5rem;
47
+ --space-5: 2.5rem;
48
+ --space-6: 4rem;
49
+
50
+ /* Shape & layout */
51
+ --radius: 8px;
52
+ --radius-lg: 16px;
53
+ --content-max: 1200px;
54
+
55
+ /* Motion */
56
+ --transition-fast: 150ms ease;
57
+ }
@@ -0,0 +1,14 @@
1
+ import type { Locale } from '../config/types.js';
2
+ /**
3
+ * Formats an ISO date (`2026-08-30`) or timestamp (`2026-08-29T23:30:00.000Z`)
4
+ * like "30 ag. 2025".
5
+ *
6
+ * The two are different things and are resolved differently. A date-only value
7
+ * is a calendar day with no instant attached, so it is rendered verbatim and
8
+ * reads the same everywhere. A timestamp is an instant, and the day it belongs
9
+ * to is resolved in SITE_TIME_ZONE: a comment posted at 01:30 in Barcelona
10
+ * belongs to that day, not to the previous one its UTC value spells out.
11
+ */
12
+ export declare function formatDate(isoValue: string, locale: Locale): string;
13
+ /** Extracts the year of an ISO date without constructing a Date. */
14
+ export declare function yearOf(isoDate: string): string;
@@ -0,0 +1,34 @@
1
+ /** Explicit BCP 47 tags — never rely on the runtime's default locale (SSR mismatch). */
2
+ const LOCALE_TAG = { ca: 'ca-ES', es: 'es-ES', en: 'en-GB' };
3
+ /**
4
+ * The foundation's editorial timezone, pinned for the same reason LOCALE_TAG
5
+ * pins the locale. A timestamp names an instant, and which day that instant
6
+ * falls on depends on where the reader stands: the server renders in UTC and
7
+ * the browser in the visitor's own zone, so leaving the day to the runtime
8
+ * makes one comment show two different dates across hydration.
9
+ */
10
+ const SITE_TIME_ZONE = 'Europe/Madrid';
11
+ const DATE_ONLY = /^\d{4}-\d{2}-\d{2}$/;
12
+ /**
13
+ * Formats an ISO date (`2026-08-30`) or timestamp (`2026-08-29T23:30:00.000Z`)
14
+ * like "30 ag. 2025".
15
+ *
16
+ * The two are different things and are resolved differently. A date-only value
17
+ * is a calendar day with no instant attached, so it is rendered verbatim and
18
+ * reads the same everywhere. A timestamp is an instant, and the day it belongs
19
+ * to is resolved in SITE_TIME_ZONE: a comment posted at 01:30 in Barcelona
20
+ * belongs to that day, not to the previous one its UTC value spells out.
21
+ */
22
+ export function formatDate(isoValue, locale) {
23
+ const dateOnly = DATE_ONLY.test(isoValue);
24
+ return new Intl.DateTimeFormat(LOCALE_TAG[locale], {
25
+ day: 'numeric',
26
+ month: 'short',
27
+ year: 'numeric',
28
+ timeZone: dateOnly ? 'UTC' : SITE_TIME_ZONE
29
+ }).format(new Date(dateOnly ? `${isoValue}T00:00:00Z` : isoValue));
30
+ }
31
+ /** Extracts the year of an ISO date without constructing a Date. */
32
+ export function yearOf(isoDate) {
33
+ return isoDate.slice(0, 4);
34
+ }
@@ -0,0 +1,11 @@
1
+ import type { UiMessages } from '../config/types.js';
2
+ import type { MilestoneCategory } from '../content/types.js';
3
+ /**
4
+ * Category → series token, fixed slot order (dataviz rule: slot 1 is brand
5
+ * teal, slots are never reordered). Labels always accompany the color dot,
6
+ * so color is never the only encoding. The --series-* tokens ship in
7
+ * tokens.css.
8
+ */
9
+ export declare const MILESTONE_CATEGORY_COLOR: Record<MilestoneCategory, string>;
10
+ /** The category's label in the host app's copy. */
11
+ export declare function milestoneCategoryLabel(category: MilestoneCategory, messages: UiMessages): string;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Category → series token, fixed slot order (dataviz rule: slot 1 is brand
3
+ * teal, slots are never reordered). Labels always accompany the color dot,
4
+ * so color is never the only encoding. The --series-* tokens ship in
5
+ * tokens.css.
6
+ */
7
+ export const MILESTONE_CATEGORY_COLOR = {
8
+ foundation: 'var(--series-1)',
9
+ lab: 'var(--series-2)',
10
+ education: 'var(--series-3)',
11
+ collaboration: 'var(--series-4)',
12
+ press: 'var(--series-5)'
13
+ };
14
+ /** The category's label in the host app's copy. */
15
+ export function milestoneCategoryLabel(category, messages) {
16
+ switch (category) {
17
+ case 'education':
18
+ return messages.category_education();
19
+ case 'lab':
20
+ return messages.category_lab();
21
+ case 'foundation':
22
+ return messages.category_foundation();
23
+ case 'collaboration':
24
+ return messages.category_collaboration();
25
+ case 'press':
26
+ return messages.category_press();
27
+ }
28
+ }
@@ -0,0 +1,2 @@
1
+ /** Prefix match over a URL pathname: '/what-we-do' covers '/what-we-do/<slug>'. */
2
+ export declare function isPathUnder(pathname: string, prefix: string): boolean;
@@ -0,0 +1,4 @@
1
+ /** Prefix match over a URL pathname: '/what-we-do' covers '/what-we-do/<slug>'. */
2
+ export function isPathUnder(pathname, prefix) {
3
+ return pathname === prefix || pathname.startsWith(`${prefix}/`);
4
+ }
package/package.json ADDED
@@ -0,0 +1,139 @@
1
+ {
2
+ "name": "@vit-foundation/ui",
3
+ "version": "0.1.0",
4
+ "scripts": {
5
+ "dev": "vite dev",
6
+ "build": "vite build && npm run prepack",
7
+ "preview": "vite preview",
8
+ "prepare": "svelte-kit sync || echo ''",
9
+ "prepack": "svelte-kit sync && svelte-package && publint",
10
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
11
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
12
+ "format": "prettier --write .",
13
+ "lint": "prettier --check . && eslint .",
14
+ "test:unit": "vitest",
15
+ "test": "npm run test:unit -- --run && npm run test:e2e",
16
+ "test:e2e": "playwright test",
17
+ "storybook": "storybook dev -p 6006",
18
+ "build-storybook": "storybook build"
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "!dist/**/*.test.*",
23
+ "!dist/**/*.spec.*",
24
+ "!dist/fixtures.*",
25
+ "!dist/**/stories/**",
26
+ "!dist/**/tests/**",
27
+ "!dist/testing/**"
28
+ ],
29
+ "sideEffects": [
30
+ "**/*.css"
31
+ ],
32
+ "svelte": "./dist/index.js",
33
+ "types": "./dist/index.d.ts",
34
+ "type": "module",
35
+ "exports": {
36
+ ".": {
37
+ "types": "./dist/index.d.ts",
38
+ "svelte": "./dist/index.js",
39
+ "default": "./dist/index.js"
40
+ },
41
+ "./ui": {
42
+ "types": "./dist/components/ui/index.d.ts",
43
+ "svelte": "./dist/components/ui/index.js",
44
+ "default": "./dist/components/ui/index.js"
45
+ },
46
+ "./layout": {
47
+ "types": "./dist/components/layout/index.d.ts",
48
+ "svelte": "./dist/components/layout/index.js",
49
+ "default": "./dist/components/layout/index.js"
50
+ },
51
+ "./weeklies": {
52
+ "types": "./dist/components/weeklies/index.d.ts",
53
+ "svelte": "./dist/components/weeklies/index.js",
54
+ "default": "./dist/components/weeklies/index.js"
55
+ },
56
+ "./projects": {
57
+ "types": "./dist/components/projects/index.d.ts",
58
+ "svelte": "./dist/components/projects/index.js",
59
+ "default": "./dist/components/projects/index.js"
60
+ },
61
+ "./team": {
62
+ "types": "./dist/components/team/index.d.ts",
63
+ "svelte": "./dist/components/team/index.js",
64
+ "default": "./dist/components/team/index.js"
65
+ },
66
+ "./timeline": {
67
+ "types": "./dist/components/timeline/index.d.ts",
68
+ "svelte": "./dist/components/timeline/index.js",
69
+ "default": "./dist/components/timeline/index.js"
70
+ },
71
+ "./jobs": {
72
+ "types": "./dist/components/jobs/index.d.ts",
73
+ "svelte": "./dist/components/jobs/index.js",
74
+ "default": "./dist/components/jobs/index.js"
75
+ },
76
+ "./edit": {
77
+ "types": "./dist/edit/index.d.ts",
78
+ "svelte": "./dist/edit/index.js",
79
+ "default": "./dist/edit/index.js"
80
+ },
81
+ "./config": {
82
+ "types": "./dist/config/index.d.ts",
83
+ "svelte": "./dist/config/index.js",
84
+ "default": "./dist/config/index.js"
85
+ },
86
+ "./tokens.css": "./dist/styles/tokens.css",
87
+ "./base.css": "./dist/styles/base.css"
88
+ },
89
+ "peerDependencies": {
90
+ "svelte": "^5.0.0"
91
+ },
92
+ "devDependencies": {
93
+ "@chromatic-com/storybook": "^4.1.2",
94
+ "@eslint/compat": "^1.4.0",
95
+ "@eslint/js": "^9.38.0",
96
+ "@playwright/test": "^1.56.1",
97
+ "@storybook/addon-a11y": "^10.5.10",
98
+ "@storybook/addon-docs": "^10.5.10",
99
+ "@storybook/addon-svelte-csf": "^5.1.2",
100
+ "@storybook/addon-vitest": "^10.5.10",
101
+ "@storybook/sveltekit": "^10.5.10",
102
+ "@sveltejs/adapter-auto": "^7.0.0",
103
+ "@sveltejs/kit": "^2.47.1",
104
+ "@sveltejs/package": "^2.5.4",
105
+ "@sveltejs/vite-plugin-svelte": "^6.2.1",
106
+ "@types/node": "^22",
107
+ "@vitest/browser-playwright": "^4.0.5",
108
+ "eslint": "^9.38.0",
109
+ "eslint-config-prettier": "^10.1.8",
110
+ "eslint-plugin-storybook": "^10.0.7",
111
+ "eslint-plugin-svelte": "^3.12.4",
112
+ "globals": "^16.4.0",
113
+ "playwright": "^1.56.1",
114
+ "prettier": "^3.6.2",
115
+ "prettier-plugin-svelte": "^3.4.0",
116
+ "publint": "^0.3.14",
117
+ "storybook": "^10.5.10",
118
+ "svelte": "^5.57.0",
119
+ "svelte-check": "^4.6.0",
120
+ "typescript": "^5.9.3",
121
+ "typescript-eslint": "^8.46.1",
122
+ "vite": "^7.1.10",
123
+ "vite-plugin-devtools-json": "^1.0.0",
124
+ "vitest": "^4.0.5",
125
+ "vitest-browser-svelte": "^2.0.1"
126
+ },
127
+ "keywords": [
128
+ "svelte"
129
+ ],
130
+ "license": "MIT",
131
+ "description": "Fundaci\u00f3 VIT's shared Svelte 5 component library with pluggable edit mode",
132
+ "repository": {
133
+ "type": "git",
134
+ "url": "git+https://github.com/fndvit/VizVit-UI.git"
135
+ },
136
+ "publishConfig": {
137
+ "access": "public"
138
+ }
139
+ }