{"_id":"@concepttocloud/saiku-design-system","_rev":"5-b589d160f630fa132826edd449f6889c","name":"@concepttocloud/saiku-design-system","dist-tags":{"latest":"2.2.0"},"versions":{"1.0.0":{"name":"@concepttocloud/saiku-design-system","version":"1.0.0","keywords":["saiku","design-system","design-tokens","svelte","tailwind","shadcn"],"license":"Apache-2.0","_id":"@concepttocloud/saiku-design-system@1.0.0","maintainers":[{"name":"ameliaux","email":"amelia@concepttocloud.com"},{"name":"magicaltroutconcepttocloud","email":"tom@concepttocloud.com"}],"homepage":"https://github.com/spiculedata/saiku","bugs":{"url":"https://github.com/spiculedata/saiku/issues"},"dist":{"shasum":"9e121517e9b321c2eec6cb5914bf273e7f800e80","tarball":"https://registry.npmjs.org/@concepttocloud/saiku-design-system/-/saiku-design-system-1.0.0.tgz","fileCount":44,"integrity":"sha512-T0IO4tDIhSsJQc7vtlPON4K5gugdt3zGPB5uVZDbzxNn3UFEuMR+fcRkmYQMuWGPwha/2HUOqQVg+/cKhsb82w==","signatures":[{"sig":"MEUCIQDJPymCqbRF5APrbpdKCq0OjWtYlvoGI3TSdX6OAdKPFgIgRinM9+jZW/GirtSmHVbcIRSmKzTTNM+xUXbWIcKjCYk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71585},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","svelte":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./tokens.css":"./dist/styles/tokens.css","./package.json":"./package.json","./tailwind.css":"./dist/styles/tailwind.css"},"gitHead":"9158de92aa164225d52fbc7bbe615d481811311f","scripts":{"build":"svelte-package --input src/lib --output dist","check":"svelte-check --tsconfig ./tsconfig.json","prepare":"npm run build","//prepare":"Runs on `npm install` both here and in saiku-ui (which takes this as a file: dep), so dist/ exists before the app builds. Also runs ahead of `npm publish`."},"_npmUser":{"name":"magicaltroutconcepttocloud","email":"tom@concepttocloud.com"},"repository":{"url":"git+https://github.com/spiculedata/saiku.git","type":"git","directory":"saiku-ui/design-system"},"_npmVersion":"11.17.0","description":"Saiku's shared design system — CSS design tokens, a Tailwind v4 theme bridge, and the Svelte 5 primitives and compounds used across Saiku and Saiku Cloud.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","bits-ui":"^2.18.1","tailwind-merge":"^3.6.0","tailwind-variants":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"svelte":"^5.56.8","typescript":"^5.7.2","svelte-check":"^4.7.5","@sveltejs/package":"^2.5.4","@sveltejs/vite-plugin-svelte":"^7.0.0"},"peerDependencies":{"svelte":"^5.0.0","tailwindcss":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/saiku-design-system_1.0.0_1786742892280_0.17783327451730346","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@concepttocloud/saiku-design-system","version":"1.0.1","keywords":["saiku","design-system","design-tokens","svelte","tailwind","shadcn"],"license":"Apache-2.0","_id":"@concepttocloud/saiku-design-system@1.0.1","maintainers":[{"name":"ameliaux","email":"amelia@concepttocloud.com"},{"name":"magicaltroutconcepttocloud","email":"tom@concepttocloud.com"}],"homepage":"https://github.com/spiculedata/saiku","bugs":{"url":"https://github.com/spiculedata/saiku/issues"},"dist":{"shasum":"fa56ea0f00178d849dc4ef459f84c001abd68a49","tarball":"https://registry.npmjs.org/@concepttocloud/saiku-design-system/-/saiku-design-system-1.0.1.tgz","fileCount":46,"integrity":"sha512-D1OfwyzYlXfR5T13rHkV7rZRP68WFLfJHuNd3/YNnrVlVmCqKZhvuiIKrFL51qtgo/cEFSCKKail82O3jGMzig==","signatures":[{"sig":"MEUCIAMbYQc6WztEgPPNiInBYhNUcwQys1oUEfZ8X+KMCRHTAiEAwsBqgUv8e+1nwWYHK1S6dZOVtHV+n+JZlL29xmNavk0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74919},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","svelte":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./tokens.css":"./dist/styles/tokens.css","./package.json":"./package.json","./tailwind.css":"./dist/styles/tailwind.css","./ui/button-variants":{"types":"./dist/ui/button-variants.d.ts","default":"./dist/ui/button-variants.js"}},"gitHead":"282849250ceba005e2428297b7ff2cbc75f848ac","scripts":{"build":"svelte-package --input src/lib --output dist","check":"svelte-check --tsconfig ./tsconfig.json","prepare":"npm run build","//prepare":"Runs on `npm install` both here and in saiku-ui (which takes this as a file: dep), so dist/ exists before the app builds. Also runs ahead of `npm publish`."},"_npmUser":{"name":"magicaltroutconcepttocloud","email":"tom@concepttocloud.com"},"repository":{"url":"git+https://github.com/spiculedata/saiku.git","type":"git","directory":"saiku-ui/design-system"},"_npmVersion":"11.17.0","description":"Saiku's shared design system — CSS design tokens, a Tailwind v4 theme bridge, and the Svelte 5 primitives and compounds used across Saiku and Saiku Cloud.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","bits-ui":"^2.18.1","tailwind-merge":"^3.6.0","tailwind-variants":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"svelte":"^5.56.8","typescript":"^5.7.2","svelte-check":"^4.7.5","@sveltejs/package":"^2.5.4","@sveltejs/vite-plugin-svelte":"^7.0.0"},"peerDependencies":{"svelte":"^5.0.0","tailwindcss":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/saiku-design-system_1.0.1_1786745417568_0.913899642560273","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@concepttocloud/saiku-design-system","version":"2.0.0","keywords":["saiku","design-system","design-tokens","svelte","tailwind","shadcn"],"license":"Apache-2.0","_id":"@concepttocloud/saiku-design-system@2.0.0","maintainers":[{"name":"ameliaux","email":"amelia@concepttocloud.com"},{"name":"magicaltroutconcepttocloud","email":"tom@concepttocloud.com"}],"homepage":"https://github.com/spiculedata/saiku","bugs":{"url":"https://github.com/spiculedata/saiku/issues"},"dist":{"shasum":"6ed21bea0b78ab620f8f6a12d5927c82ec8ead66","tarball":"https://registry.npmjs.org/@concepttocloud/saiku-design-system/-/saiku-design-system-2.0.0.tgz","fileCount":73,"integrity":"sha512-RsdAy7ryB6VKuHrxLPtIB1n/ivcY8tX10AQwfuVS2QEbmZ1yQXML4Odcj7L6z+0eyZqtNZ7RbYB78eXzXhS1Wg==","signatures":[{"sig":"MEYCIQCZ/J8zWN3nMgXHJex44cVXIEDJitvRklbGU5134TsLlwIhAOq8QQN32y1IaUY+Xkwt307gueES8YxifNGnIuXYe/Ti","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":113895},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","svelte":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./motion.css":"./dist/styles/motion.css","./tokens.css":"./dist/styles/tokens.css","./package.json":"./package.json","./tailwind.css":"./dist/styles/tailwind.css","./ui/button-variants":{"types":"./dist/ui/button-variants.d.ts","default":"./dist/ui/button-variants.js"}},"gitHead":"b2026e85e8a3fd4ef03a4f7c1218b5cdb2f6fd09","scripts":{"build":"svelte-package --input src/lib --output dist","check":"svelte-check --tsconfig ./tsconfig.json","prepare":"npm run build","//prepare":"Runs on `npm install` both here and in saiku-ui (which takes this as a file: dep), so dist/ exists before the app builds. Also runs ahead of `npm publish`."},"_npmUser":{"name":"magicaltroutconcepttocloud","email":"tom@concepttocloud.com"},"repository":{"url":"git+https://github.com/spiculedata/saiku.git","type":"git","directory":"saiku-ui/design-system"},"_npmVersion":"11.17.0","description":"Saiku's shared design system — CSS design tokens, a Tailwind v4 theme bridge, and the Svelte 5 primitives and compounds used across Saiku and Saiku Cloud.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","bits-ui":"^2.18.1","tailwind-merge":"^3.6.0","tailwind-variants":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"svelte":"^5.56.8","typescript":"^5.7.2","svelte-check":"^4.7.5","@sveltejs/package":"^2.5.4","@sveltejs/vite-plugin-svelte":"^7.0.0"},"peerDependencies":{"svelte":"^5.0.0","tailwindcss":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/saiku-design-system_2.0.0_1786755794777_0.5894131732129719","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@concepttocloud/saiku-design-system","version":"2.1.0","keywords":["saiku","design-system","design-tokens","svelte","tailwind","shadcn"],"license":"Apache-2.0","_id":"@concepttocloud/saiku-design-system@2.1.0","maintainers":[{"name":"ameliaux","email":"amelia@concepttocloud.com"},{"name":"magicaltroutconcepttocloud","email":"tom@concepttocloud.com"}],"homepage":"https://github.com/spiculedata/saiku","bugs":{"url":"https://github.com/spiculedata/saiku/issues"},"dist":{"shasum":"59bf1f002f9ec03c09a8e16e9ec231ca263ac1dd","tarball":"https://registry.npmjs.org/@concepttocloud/saiku-design-system/-/saiku-design-system-2.1.0.tgz","fileCount":73,"integrity":"sha512-S9/mAEOKH4ZX+HiWj2NEE8AZ0D/JZpIG8cDR8FVdNPIH4ECLHPOmbg3o6kDKeVrNWnV9iXMM9AJNqL2QDX97PQ==","signatures":[{"sig":"MEUCIQCmU9cTZwa/LHuPNvH8IxaIIGBUAKaq361luO1TDdsvaQIgHAmwpm8ROZI0mzWt9tBo3DeTZaTBBfzIulnr/NSlLHQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116781},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","svelte":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./motion.css":"./dist/styles/motion.css","./tokens.css":"./dist/styles/tokens.css","./package.json":"./package.json","./tailwind.css":"./dist/styles/tailwind.css","./ui/button-variants":{"types":"./dist/ui/button-variants.d.ts","default":"./dist/ui/button-variants.js"}},"gitHead":"806ab7c25ea7fc21f80296188caf5926cd5e97c7","scripts":{"build":"svelte-package --input src/lib --output dist","check":"svelte-check --tsconfig ./tsconfig.json","prepare":"npm run build","//prepare":"Runs on `npm install` both here and in saiku-ui (which takes this as a file: dep), so dist/ exists before the app builds. Also runs ahead of `npm publish`."},"_npmUser":{"name":"magicaltroutconcepttocloud","email":"tom@concepttocloud.com"},"repository":{"url":"git+https://github.com/spiculedata/saiku.git","type":"git","directory":"saiku-ui/design-system"},"_npmVersion":"11.17.0","description":"Saiku's shared design system — CSS design tokens, a Tailwind v4 theme bridge, and the Svelte 5 primitives and compounds used across Saiku and Saiku Cloud.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","bits-ui":"^2.18.1","tailwind-merge":"^3.6.0","tailwind-variants":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"svelte":"^5.56.8","typescript":"^5.7.2","svelte-check":"^4.7.5","@sveltejs/package":"^2.5.4","@sveltejs/vite-plugin-svelte":"^7.0.0"},"peerDependencies":{"svelte":"^5.0.0","tailwindcss":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/saiku-design-system_2.1.0_1786760943206_0.8467250599759695","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@concepttocloud/saiku-design-system","version":"2.2.0","description":"Saiku's shared design system — CSS design tokens, a Tailwind v4 theme bridge, and the Svelte 5 primitives and compounds used across Saiku and Saiku Cloud.","license":"Apache-2.0","type":"module","svelte":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","svelte":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./ui/button-variants":{"types":"./dist/ui/button-variants.d.ts","default":"./dist/ui/button-variants.js"},"./tokens.css":"./dist/styles/tokens.css","./tailwind.css":"./dist/styles/tailwind.css","./motion.css":"./dist/styles/motion.css","./package.json":"./package.json"},"sideEffects":["**/*.css"],"scripts":{"build":"svelte-package --input src/lib --output dist","//prepare":"Runs on `npm install` both here and in saiku-ui (which takes this as a file: dep), so dist/ exists before the app builds. Also runs ahead of `npm publish`.","prepare":"npm run build","check":"svelte-check --tsconfig ./tsconfig.json"},"peerDependencies":{"svelte":"^5.0.0","tailwindcss":"^4.0.0"},"dependencies":{"bits-ui":"^2.18.1","clsx":"^2.1.1","tailwind-merge":"^3.6.0","tailwind-variants":"^3.3.1"},"devDependencies":{"@sveltejs/package":"^2.5.4","@sveltejs/vite-plugin-svelte":"^7.0.0","svelte":"^5.56.8","svelte-check":"^4.7.5","typescript":"^5.7.2"},"keywords":["saiku","design-system","design-tokens","svelte","tailwind","shadcn"],"homepage":"https://github.com/spiculedata/saiku","repository":{"type":"git","url":"git+https://github.com/spiculedata/saiku.git","directory":"saiku-ui/design-system"},"bugs":{"url":"https://github.com/spiculedata/saiku/issues"},"gitHead":"d06f2a2ce231cfbdd09d217b743f6acf3ff7fe0e","_id":"@concepttocloud/saiku-design-system@2.2.0","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-UVy1XG5DbcNRNzDuBoHIwBhXhQkW+1I+SKpdtnqdXic/by32c5JlpMlooR0VF3ctg9t96CUP+FKUbj1iyuRcfw==","shasum":"20673be0f4e5377ac63ca4abc33ae0f5f924bb23","tarball":"https://registry.npmjs.org/@concepttocloud/saiku-design-system/-/saiku-design-system-2.2.0.tgz","fileCount":73,"unpackedSize":117271,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDBHhV/VjQmb2+17rR+0SMkW3HgveQGyhPNJqIs6wX8NAIgNio0rWoULZgPfxj+nTri044qNiZ9boWz6R+HKR3Kjqo="}]},"_npmUser":{"name":"magicaltroutconcepttocloud","email":"tom@concepttocloud.com"},"directories":{},"maintainers":[{"name":"ameliaux","email":"amelia@concepttocloud.com"},{"name":"magicaltroutconcepttocloud","email":"tom@concepttocloud.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/saiku-design-system_2.2.0_1786766195190_0.8057699036529609"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-14T21:28:12.004Z","modified":"2026-08-15T03:56:35.468Z","1.0.0":"2026-08-14T21:28:12.434Z","1.0.1":"2026-08-14T22:10:17.716Z","2.0.0":"2026-08-15T01:03:14.929Z","2.1.0":"2026-08-15T02:29:03.353Z","2.2.0":"2026-08-15T03:56:35.294Z"},"bugs":{"url":"https://github.com/spiculedata/saiku/issues"},"license":"Apache-2.0","homepage":"https://github.com/spiculedata/saiku","keywords":["saiku","design-system","design-tokens","svelte","tailwind","shadcn"],"repository":{"type":"git","url":"git+https://github.com/spiculedata/saiku.git","directory":"saiku-ui/design-system"},"description":"Saiku's shared design system — CSS design tokens, a Tailwind v4 theme bridge, and the Svelte 5 primitives and compounds used across Saiku and Saiku Cloud.","maintainers":[{"name":"ameliaux","email":"amelia@concepttocloud.com"},{"name":"magicaltroutconcepttocloud","email":"tom@concepttocloud.com"}],"readme":"# @concepttocloud/saiku-design-system\n\nThe design system shared by **Saiku** (`saiku-ui`) and **Saiku Cloud** (`dashboard`) — CSS\ndesign tokens, a Tailwind v4 theme bridge, and the Svelte 5 components built on top of them.\n\nApache-2.0. Published from the open-source [saiku](https://github.com/spiculedata/saiku)\nrepo so anyone building against Saiku can use the same vocabulary the product uses.\n\n```sh\nnpm install @concepttocloud/saiku-design-system\n```\n\n## What's in it\n\n| Entry                                                    | Contents                                                                                                                                                                                                                                   |\n| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `@concepttocloud/saiku-design-system`                    | Compounds: `PageHeader`, `FeedbackBanner`, `Badge`, `EmptyState`, `SectionCard`, `Toast`, `FormField`, `SortableColumnHeader`, plus the `TONES` / `TONE_CLASSES` / `SIZES` vocabulary.                                                     |\n| `@concepttocloud/saiku-design-system/ui`                 | Primitives. Action: `Button` (+ `buttonVariants`). Surface: `Card` group, `Divider`. Form: `Input`, `Textarea`, `Checkbox`, `Radio`, `Select`, `Switch`. Overlay: `Tooltip`, `Popover`, `Dialog`, `DropdownMenu`, `MenuItem`. Misc: `Kbd`. |\n| `@concepttocloud/saiku-design-system/ui/button-variants` | Just the button class contract (`buttonVariants` + its types). Import from here, not the `/ui` barrel, when you only want the classes — the barrel pulls in every primitive, `Tooltip`'s `bits-ui` dependency included.                    |\n| `@concepttocloud/saiku-design-system/tokens.css`         | The token layer — every colour, space, radius, type, weight, shadow and duration token, with light + dark values.                                                                                                                          |\n| `@concepttocloud/saiku-design-system/tailwind.css`       | Tailwind v4 entry: `@theme inline` bridge mapping the tokens onto Tailwind's namespace, plus the `dark:` custom variant.                                                                                                                   |\n\n## Usage\n\nImport the CSS once, at your app's root, **tokens first**:\n\n```css\n@import '@concepttocloud/saiku-design-system/tokens.css';\n@import '@concepttocloud/saiku-design-system/tailwind.css';\n```\n\nThen use the components and the token utilities:\n\n```svelte\n<script>\n\timport { PageHeader, FeedbackBanner } from '@concepttocloud/saiku-design-system';\n\timport { Button } from '@concepttocloud/saiku-design-system/ui';\n</script>\n\n<PageHeader title=\"Connections\" subtitle=\"Where Saiku reads your data from\" />\n<FeedbackBanner tone=\"success\">Saved.</FeedbackBanner>\n<Button variant=\"outline\">Cancel</Button>\n```\n\n`tailwind.css` deliberately imports `tailwindcss/theme.css` and `tailwindcss/utilities.css`\nbut **not** preflight — both consuming apps carry their own base reset and would lose\nbox-sizing / heading assumptions if preflight landed on top. If you're starting fresh, add\n`@import \"tailwindcss/preflight.css\" layer(base);` yourself.\n\n### Cascade layers are load-bearing\n\n`tailwind.css` declares `@layer theme, base, components, utilities;`. Any type-selector rule\nyou write (`a { color: ... }`) must live in `@layer base`, or it will beat every Tailwind\nutility regardless of specificity — that's the cascade-layers spec, and an unlayered\n`a { color: var(--accent) }` once ate `text-primary-foreground` on every anchor-as-button\nin saiku-ui.\n\n## Tone tokens\n\nUse the semantic tones, never raw Tailwind colours — raw shades only resolve to one value\nand break in the other theme:\n\n```svelte\n<p class=\"text-success\">Uploaded.</p>\n<!-- yes -->\n<p class=\"text-emerald-300\">Uploaded.</p>\n<!-- no -->\n```\n\nThe tone aliases (`--success`, `--warning`, `--info`, `--destructive`) point at the **-text\n(600)** weight of their ramp, not the -action (500) weight. 600 clears AA as body text on a\nlight surface where 500 does not, and white-on-600 clears AA for the `bg-*` fill where\nwhite-on-500 sits at roughly 2.8:1.\n\n> **Dark-mode caveat on `bg-*` tone fills.** In dark mode the ramp inverts and `-text`\n> resolves to the _300_ step, which is light. `text-success` gets better contrast on a dark\n> surface, but `bg-success` becomes a light fill — so pair it with `text-success-foreground`\n> (which resolves through `--on-success-action`) rather than assuming white reads on it.\n> Tone fills that need a dark-mode-safe background should use the `-soft` variants\n> (`bg-success-soft`), which are built for exactly that.\n\n## The Button, and the two generations behind it\n\nsaiku-cloud grew a second primitive set after this one, with better ergonomics —\n`loading` state, `iconLeft` / `iconRight` snippets, `href` polymorphism, `fullWidth` — but\nhand-rolled classes, so it had no exportable class contract and no `class` or attribute\npassthrough. The older shadcn-shaped set had the contract and the composability and none of\nthe ergonomics. The migration between them stalled at 3 call sites against 195.\n\n`Button` here is the union of both, so nothing was thrown away:\n\n```svelte\n<Button variant=\"outline\" size=\"sm\" loading={saving} onclick={save}>Save</Button>\n<Button href=\"/docs\" variant=\"link\">Docs</Button>\n<Button variant=\"ghost\" size=\"icon\" title=\"Close\" aria-label=\"Close\">…</Button>\n```\n\n- **Variants**: `primary` (default), `secondary`, `outline`, `ghost`, `destructive`, `link`,\n  `text`. `default` is kept as an alias for `primary`.\n- **Sizes**: `sm`, `md` (default), `lg`, `icon`, `none`. `default` is an alias for `md`.\n- `class` merges through `tailwind-merge`, and every other attribute spreads onto the\n  element — so `title`, `aria-*`, `role` and `data-testid` all work.\n\n> **Sizing changed with 2.0.0.** The scale is the newer, tighter one: `sm` is `h-7` (was\n> `h-9`) and the default is `h-9` (was `h-10`). That's a deliberate visual change across\n> every button, not a regression. If a specific button needs the old height, pass\n> `size=\"lg\"` (`h-10`) or override with `class`.\n\n## Adding a component\n\n1. Drop the `.svelte` file in `src/lib/`.\n2. Re-export it from `src/lib/index.ts` (primitives from `src/lib/ui/index.ts`).\n3. Add a story in saiku-ui at `src/lib/design-system/<Name>.stories.svelte` — Storybook is\n   the catalogue and lives in the app, not the package.\n4. Keep it generic. Anything that knows about cubes, MDX, connections, or billing belongs in\n   the consuming app, not here.\n\n## Building\n\n```sh\nnpm install\nnpm run build     # svelte-package: src/lib → dist (JS + .d.ts + CSS passthrough)\nnpm run check     # svelte-check\n```\n\n`dist/` is generated and git-ignored.\n\n## Releasing\n\nThe package carries **its own version**, starting at 1.0.0 and independent of both the\nsaiku reactor (4.x) and saiku-ui (3.x) — it moves on its own cadence, because coupling it\nto product releases would mean saiku-cloud waits for a full Saiku release every time a\ntoken changes. (The sibling `@concepttocloud/saiku-embed*` packages deliberately mirror\nsaiku-ui's version because they _are_ saiku-ui's embed bundle; this one isn't, so its\nversion number is its own and actually means something about design-system compatibility.)\n\nTo cut a release: bump `version` here and merge to `development`. The\n`.github/workflows/design-system.yml` workflow builds, type-checks, verifies every export\ntarget exists, then publishes. It checks the registry first and skips cleanly if the\nversion is already out, so merging a package change without a version bump is a no-op\nrather than a failure. `workflow_dispatch` offers a `dry_run` input to build and verify\nwithout publishing.\n","readmeFilename":"README.md"}