@alfakit/core 0.1.13 → 0.2.2

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 (42) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cms.d.ts +10 -1
  3. package/dist/cms.d.ts.map +1 -1
  4. package/dist/cms.js +30 -1
  5. package/dist/cms.js.map +1 -1
  6. package/dist/form.d.ts +10 -1
  7. package/dist/form.d.ts.map +1 -1
  8. package/dist/form.js +26 -4
  9. package/dist/form.js.map +1 -1
  10. package/dist/i18n.d.ts +9 -0
  11. package/dist/i18n.d.ts.map +1 -1
  12. package/dist/i18n.js +14 -1
  13. package/dist/i18n.js.map +1 -1
  14. package/dist/index.d.ts +7 -6
  15. package/dist/index.js +5 -4
  16. package/dist/kanban.d.ts.map +1 -1
  17. package/dist/kanban.js +25 -1
  18. package/dist/kanban.js.map +1 -1
  19. package/dist/prefetch.js +12 -1
  20. package/dist/prefetch.js.map +1 -1
  21. package/dist/realtime.d.ts +3 -3
  22. package/dist/realtime.js +3 -3
  23. package/dist/realtime.js.map +1 -1
  24. package/dist/schema/cms.d.ts +23 -0
  25. package/dist/schema/cms.d.ts.map +1 -1
  26. package/dist/schema/components.d.ts +2 -0
  27. package/dist/schema/components.d.ts.map +1 -1
  28. package/dist/schema/components.js.map +1 -1
  29. package/dist/schema/index.d.ts +3 -3
  30. package/dist/schema/panel.d.ts +14 -0
  31. package/dist/schema/panel.d.ts.map +1 -1
  32. package/dist/schema/panel.js.map +1 -1
  33. package/dist/starter-kit-document.d.ts +32 -0
  34. package/dist/starter-kit-document.d.ts.map +1 -0
  35. package/dist/starter-kit-document.js +57 -0
  36. package/dist/starter-kit-document.js.map +1 -0
  37. package/dist/utils/container-breakpoints.d.ts +9 -0
  38. package/dist/utils/container-breakpoints.d.ts.map +1 -1
  39. package/dist/utils/container-breakpoints.js +63 -1
  40. package/dist/utils/container-breakpoints.js.map +1 -1
  41. package/package.json +1 -1
  42. package/themes.css +92 -0
@@ -58,6 +58,68 @@ function containerColumnSpanClasses(span) {
58
58
  return value ? CONTAINER_COL_SPAN[breakpoint]?.[String(value)] : void 0;
59
59
  }).filter(Boolean).join(" ");
60
60
  }
61
+ /**
62
+ * `contentGrid()` breakpoints, read against the width of the table rather than the
63
+ * viewport: the table sits beside the panel sidebar (and a cluster's sub-navigation), so a
64
+ * viewport breakpoint says little about the room the cards have. Each viewport key maps to
65
+ * the largest container size at or below that viewport minus 24rem (a 16rem sidebar plus
66
+ * the page's gutters): `md` 48rem → `@sm` 24rem, `xl` 80rem → `@4xl` 56rem.
67
+ */
68
+ const CONTENT_GRID_FROM = {
69
+ default: null,
70
+ sm: "@3xs",
71
+ md: "@sm",
72
+ lg: "@xl",
73
+ xl: "@4xl",
74
+ "2xl": "@6xl"
75
+ };
76
+ /**
77
+ * The smallest container size that keeps `n` cards at least 15rem wide, with the grid's
78
+ * `p-4` and `gap-4`: 16rem per column plus 1rem. Five or more columns need `@7xl` (80rem).
79
+ */
80
+ const CONTENT_GRID_MIN = {
81
+ 1: null,
82
+ 2: "@xl",
83
+ 3: "@4xl",
84
+ 4: "@6xl"
85
+ };
86
+ const CONTENT_GRID_KEYS = [
87
+ "default",
88
+ "sm",
89
+ "md",
90
+ "lg",
91
+ "xl",
92
+ "2xl"
93
+ ];
94
+ function widerBreakpoint(a, b) {
95
+ if (!a) return b;
96
+ if (!b) return a;
97
+ return CONTAINER_BREAKPOINTS.indexOf(a) >= CONTAINER_BREAKPOINTS.indexOf(b) ? a : b;
98
+ }
99
+ /**
100
+ * Classes for a table's `contentGrid()`: one column, then `@…:grid-cols-N` container-query
101
+ * classes relative to the `@container` around the card grid. A column count applies from
102
+ * the wider of its key's size (`CONTENT_GRID_FROM`) and the size that fits that many cards
103
+ * (`CONTENT_GRID_MIN`), so cards get fewer columns instead of getting narrow. Container
104
+ * keys (`'@lg' => 2`) are used as given; when two keys land on the same size, the later
105
+ * (wider) key wins.
106
+ */
107
+ function contentGridClasses(grid) {
108
+ const classes = /* @__PURE__ */ new Map();
109
+ for (const key of CONTENT_GRID_KEYS) {
110
+ const value = grid?.[key];
111
+ if (!value) continue;
112
+ const count = Math.min(Math.max(Math.trunc(value), 1), 12);
113
+ const at = widerBreakpoint(CONTENT_GRID_FROM[key] ?? null, CONTENT_GRID_MIN[count] ?? "@7xl");
114
+ const cls = at ? CONTAINER_GRID_COLS[at]?.[String(count)] : void 0;
115
+ if (at && cls) classes.set(at, cls);
116
+ }
117
+ for (const breakpoint of CONTAINER_BREAKPOINTS) {
118
+ const cls = CONTAINER_GRID_COLS[breakpoint]?.[String(grid?.[breakpoint] ?? "")];
119
+ if (cls) classes.set(breakpoint, cls);
120
+ }
121
+ return ["grid-cols-1", ...CONTAINER_BREAKPOINTS.map((breakpoint) => classes.get(breakpoint)).filter(Boolean)].join(" ");
122
+ }
61
123
  const FLEX_ROW = {
62
124
  default: "flex-row",
63
125
  sm: "sm:flex-row",
@@ -120,6 +182,6 @@ function flexItemClasses(component) {
120
182
  return component.grow === false ? "min-w-0 shrink-0" : "min-w-0 flex-1";
121
183
  }
122
184
  //#endregion
123
- export { CONTAINER_BREAKPOINTS, containerColumnSpanClasses, containerGridColumnsClasses, flexItemClasses, flexLayoutClasses, hasContainerBreakpoints };
185
+ export { CONTAINER_BREAKPOINTS, containerColumnSpanClasses, containerGridColumnsClasses, contentGridClasses, flexItemClasses, flexLayoutClasses, hasContainerBreakpoints };
124
186
 
125
187
  //# sourceMappingURL=container-breakpoints.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"container-breakpoints.js","names":[],"sources":["../../src/utils/container-breakpoints.ts"],"sourcesContent":["import type { Breakpoints, ColumnSpanValue, ContainerBreakpoint } from '../schema/common'\n\n/**\n * Container-query variants of the grid classes: a `columns` map with `@md`-style keys\n * follows the width of the surrounding `@container` instead of the viewport. Classes are\n * spelled out in full so Tailwind's scanner (and `@source inline`) can see them.\n */\nexport const CONTAINER_BREAKPOINTS: readonly ContainerBreakpoint[] = [\n '@3xs',\n '@2xs',\n '@xs',\n '@sm',\n '@md',\n '@lg',\n '@xl',\n '@2xl',\n '@3xl',\n '@4xl',\n '@5xl',\n '@6xl',\n '@7xl',\n]\n\nconst SPANS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] as const\n\nfunction table(prefix: string, values: readonly (number | string)[]): Record<string, string> {\n return Object.fromEntries(values.map((value) => [String(value), `${prefix}${value}`]))\n}\n\nconst CONTAINER_GRID_COLS: Record<string, Record<string, string>> = Object.fromEntries(\n CONTAINER_BREAKPOINTS.map((breakpoint) => [breakpoint, table(`${breakpoint}:grid-cols-`, SPANS)]),\n)\n\nconst CONTAINER_COL_SPAN: Record<string, Record<string, string>> = Object.fromEntries(\n CONTAINER_BREAKPOINTS.map((breakpoint) => [\n breakpoint,\n table(`${breakpoint}:col-span-`, [...SPANS, 'full']),\n ]),\n)\n\n/** Whether a responsive map uses container sizes (`@md`) and so needs an `@container` parent. */\nexport function hasContainerBreakpoints(map: Breakpoints<unknown> | undefined | null): boolean {\n return !!map && Object.keys(map).some((key) => key.startsWith('@'))\n}\n\n/** `@md:grid-cols-3`-style classes for the container keys of a `columns` map. */\nexport function containerGridColumnsClasses(columns: Breakpoints | undefined): string {\n if (!columns) return ''\n\n return CONTAINER_BREAKPOINTS.map((breakpoint) => {\n const value = columns[breakpoint]\n\n return value ? CONTAINER_GRID_COLS[breakpoint]?.[String(value)] : undefined\n })\n .filter(Boolean)\n .join(' ')\n}\n\n/** `@md:col-span-2`-style classes for the container keys of a `columnSpan` map. */\nexport function containerColumnSpanClasses(span: Breakpoints<ColumnSpanValue> | undefined): string {\n if (!span) return ''\n\n return CONTAINER_BREAKPOINTS.map((breakpoint) => {\n const value = span[breakpoint]\n\n return value ? CONTAINER_COL_SPAN[breakpoint]?.[String(value)] : undefined\n })\n .filter(Boolean)\n .join(' ')\n}\n\nconst FLEX_ROW: Record<string, string> = {\n default: 'flex-row',\n sm: 'sm:flex-row',\n md: 'md:flex-row',\n lg: 'lg:flex-row',\n xl: 'xl:flex-row',\n '2xl': '2xl:flex-row',\n}\n\n/** `Flex::alignment()`: main-axis alignment (logical, so `start` follows the direction). */\nconst FLEX_JUSTIFY: Record<string, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n justify: 'justify-between',\n}\n\nconst FLEX_ALIGN: Record<string, Record<string, string>> = {\n start: {\n default: 'items-start',\n sm: 'sm:items-start',\n md: 'md:items-start',\n lg: 'lg:items-start',\n xl: 'xl:items-start',\n '2xl': '2xl:items-start',\n },\n center: {\n default: 'items-center',\n sm: 'sm:items-center',\n md: 'md:items-center',\n lg: 'lg:items-center',\n xl: 'xl:items-center',\n '2xl': '2xl:items-center',\n },\n end: {\n default: 'items-end',\n sm: 'sm:items-end',\n md: 'md:items-end',\n lg: 'lg:items-end',\n xl: 'xl:items-end',\n '2xl': '2xl:items-end',\n },\n}\n\n/**\n * Classes for a `Flex` schema component: stacked, then a row (and the vertical alignment)\n * from its `from` breakpoint. Force-generated with `@source inline(...)` in each renderer.\n */\nexport function flexLayoutClasses(flex: {\n from?: string | null\n verticalAlignment?: string | null\n alignment?: string | null\n}): string {\n const from = flex.from ?? 'default'\n const align = flex.verticalAlignment ? FLEX_ALIGN[flex.verticalAlignment]?.[from] : undefined\n const justify = flex.alignment ? FLEX_JUSTIFY[flex.alignment] : undefined\n\n return ['flex flex-col gap-6', FLEX_ROW[from] ?? 'flex-row', align, justify]\n .filter(Boolean)\n .join(' ')\n}\n\n/** Width behaviour of a child inside a `Flex`: share the row, or keep its natural width. */\nexport function flexItemClasses(component: { grow?: boolean }): string {\n return component.grow === false ? 'min-w-0 shrink-0' : 'min-w-0 flex-1'\n}\n"],"mappings":";;;;;;AAOA,MAAa,wBAAwD;CACnE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,QAAQ;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;CAAI;CAAI;AAAE;AAEpD,SAAS,MAAM,QAAgB,QAA8D;CAC3F,OAAO,OAAO,YAAY,OAAO,KAAK,UAAU,CAAC,OAAO,KAAK,GAAG,GAAG,SAAS,OAAO,CAAC,CAAC;AACvF;AAEA,MAAM,sBAA8D,OAAO,YACzE,sBAAsB,KAAK,eAAe,CAAC,YAAY,MAAM,GAAG,WAAW,cAAc,KAAK,CAAC,CAAC,CAClG;AAEA,MAAM,qBAA6D,OAAO,YACxE,sBAAsB,KAAK,eAAe,CACxC,YACA,MAAM,GAAG,WAAW,aAAa,CAAC,GAAG,OAAO,MAAM,CAAC,CACrD,CAAC,CACH;;AAGA,SAAgB,wBAAwB,KAAuD;CAC7F,OAAO,CAAC,CAAC,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC,MAAM,QAAQ,IAAI,WAAW,GAAG,CAAC;AACpE;;AAGA,SAAgB,4BAA4B,SAA0C;CACpF,IAAI,CAAC,SAAS,OAAO;CAErB,OAAO,sBAAsB,KAAK,eAAe;EAC/C,MAAM,QAAQ,QAAQ;EAEtB,OAAO,QAAQ,oBAAoB,WAAW,GAAG,OAAO,KAAK,KAAK,KAAA;CACpE,CAAC,CAAC,CACC,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb;;AAGA,SAAgB,2BAA2B,MAAwD;CACjG,IAAI,CAAC,MAAM,OAAO;CAElB,OAAO,sBAAsB,KAAK,eAAe;EAC/C,MAAM,QAAQ,KAAK;EAEnB,OAAO,QAAQ,mBAAmB,WAAW,GAAG,OAAO,KAAK,KAAK,KAAA;CACnE,CAAC,CAAC,CACC,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb;AAEA,MAAM,WAAmC;CACvC,SAAS;CACT,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;AACT;;AAGA,MAAM,eAAuC;CAC3C,OAAO;CACP,QAAQ;CACR,KAAK;CACL,SAAS;CACT,SAAS;AACX;AAEA,MAAM,aAAqD;CACzD,OAAO;EACL,SAAS;EACT,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,OAAO;CACT;CACA,QAAQ;EACN,SAAS;EACT,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,OAAO;CACT;CACA,KAAK;EACH,SAAS;EACT,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,OAAO;CACT;AACF;;;;;AAMA,SAAgB,kBAAkB,MAIvB;CACT,MAAM,OAAO,KAAK,QAAQ;CAC1B,MAAM,QAAQ,KAAK,oBAAoB,WAAW,KAAK,kBAAkB,GAAG,QAAQ,KAAA;CACpF,MAAM,UAAU,KAAK,YAAY,aAAa,KAAK,aAAa,KAAA;CAEhE,OAAO;EAAC;EAAuB,SAAS,SAAS;EAAY;EAAO;CAAO,CAAC,CACzE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb;;AAGA,SAAgB,gBAAgB,WAAuC;CACrE,OAAO,UAAU,SAAS,QAAQ,qBAAqB;AACzD"}
1
+ {"version":3,"file":"container-breakpoints.js","names":[],"sources":["../../src/utils/container-breakpoints.ts"],"sourcesContent":["import type { Breakpoints, ColumnSpanValue, ContainerBreakpoint } from '../schema/common'\n\n/**\n * Container-query variants of the grid classes: a `columns` map with `@md`-style keys\n * follows the width of the surrounding `@container` instead of the viewport. Classes are\n * spelled out in full so Tailwind's scanner (and `@source inline`) can see them.\n */\nexport const CONTAINER_BREAKPOINTS: readonly ContainerBreakpoint[] = [\n '@3xs',\n '@2xs',\n '@xs',\n '@sm',\n '@md',\n '@lg',\n '@xl',\n '@2xl',\n '@3xl',\n '@4xl',\n '@5xl',\n '@6xl',\n '@7xl',\n]\n\nconst SPANS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] as const\n\nfunction table(prefix: string, values: readonly (number | string)[]): Record<string, string> {\n return Object.fromEntries(values.map((value) => [String(value), `${prefix}${value}`]))\n}\n\nconst CONTAINER_GRID_COLS: Record<string, Record<string, string>> = Object.fromEntries(\n CONTAINER_BREAKPOINTS.map((breakpoint) => [breakpoint, table(`${breakpoint}:grid-cols-`, SPANS)]),\n)\n\nconst CONTAINER_COL_SPAN: Record<string, Record<string, string>> = Object.fromEntries(\n CONTAINER_BREAKPOINTS.map((breakpoint) => [\n breakpoint,\n table(`${breakpoint}:col-span-`, [...SPANS, 'full']),\n ]),\n)\n\n/** Whether a responsive map uses container sizes (`@md`) and so needs an `@container` parent. */\nexport function hasContainerBreakpoints(map: Breakpoints<unknown> | undefined | null): boolean {\n return !!map && Object.keys(map).some((key) => key.startsWith('@'))\n}\n\n/** `@md:grid-cols-3`-style classes for the container keys of a `columns` map. */\nexport function containerGridColumnsClasses(columns: Breakpoints | undefined): string {\n if (!columns) return ''\n\n return CONTAINER_BREAKPOINTS.map((breakpoint) => {\n const value = columns[breakpoint]\n\n return value ? CONTAINER_GRID_COLS[breakpoint]?.[String(value)] : undefined\n })\n .filter(Boolean)\n .join(' ')\n}\n\n/** `@md:col-span-2`-style classes for the container keys of a `columnSpan` map. */\nexport function containerColumnSpanClasses(span: Breakpoints<ColumnSpanValue> | undefined): string {\n if (!span) return ''\n\n return CONTAINER_BREAKPOINTS.map((breakpoint) => {\n const value = span[breakpoint]\n\n return value ? CONTAINER_COL_SPAN[breakpoint]?.[String(value)] : undefined\n })\n .filter(Boolean)\n .join(' ')\n}\n\n/**\n * `contentGrid()` breakpoints, read against the width of the table rather than the\n * viewport: the table sits beside the panel sidebar (and a cluster's sub-navigation), so a\n * viewport breakpoint says little about the room the cards have. Each viewport key maps to\n * the largest container size at or below that viewport minus 24rem (a 16rem sidebar plus\n * the page's gutters): `md` 48rem → `@sm` 24rem, `xl` 80rem → `@4xl` 56rem.\n */\nconst CONTENT_GRID_FROM: Record<string, ContainerBreakpoint | null> = {\n default: null,\n sm: '@3xs',\n md: '@sm',\n lg: '@xl',\n xl: '@4xl',\n '2xl': '@6xl',\n}\n\n/**\n * The smallest container size that keeps `n` cards at least 15rem wide, with the grid's\n * `p-4` and `gap-4`: 16rem per column plus 1rem. Five or more columns need `@7xl` (80rem).\n */\nconst CONTENT_GRID_MIN: Record<number, ContainerBreakpoint | null> = {\n 1: null,\n 2: '@xl', // 33rem → 36rem\n 3: '@4xl', // 49rem → 56rem\n 4: '@6xl', // 65rem → 72rem\n}\n\nconst CONTENT_GRID_KEYS = ['default', 'sm', 'md', 'lg', 'xl', '2xl'] as const\n\nfunction widerBreakpoint(\n a: ContainerBreakpoint | null,\n b: ContainerBreakpoint | null,\n): ContainerBreakpoint | null {\n if (!a) return b\n if (!b) return a\n\n return CONTAINER_BREAKPOINTS.indexOf(a) >= CONTAINER_BREAKPOINTS.indexOf(b) ? a : b\n}\n\n/**\n * Classes for a table's `contentGrid()`: one column, then `@…:grid-cols-N` container-query\n * classes relative to the `@container` around the card grid. A column count applies from\n * the wider of its key's size (`CONTENT_GRID_FROM`) and the size that fits that many cards\n * (`CONTENT_GRID_MIN`), so cards get fewer columns instead of getting narrow. Container\n * keys (`'@lg' => 2`) are used as given; when two keys land on the same size, the later\n * (wider) key wins.\n */\nexport function contentGridClasses(grid: Breakpoints | undefined | null): string {\n const classes = new Map<ContainerBreakpoint, string>()\n\n for (const key of CONTENT_GRID_KEYS) {\n const value = grid?.[key]\n\n if (!value) continue\n\n const count = Math.min(Math.max(Math.trunc(value), 1), 12)\n const at = widerBreakpoint(CONTENT_GRID_FROM[key] ?? null, CONTENT_GRID_MIN[count] ?? '@7xl')\n const cls = at ? CONTAINER_GRID_COLS[at]?.[String(count)] : undefined\n\n if (at && cls) classes.set(at, cls)\n }\n\n for (const breakpoint of CONTAINER_BREAKPOINTS) {\n const cls = CONTAINER_GRID_COLS[breakpoint]?.[String(grid?.[breakpoint] ?? '')]\n\n if (cls) classes.set(breakpoint, cls)\n }\n\n return [\n 'grid-cols-1',\n ...CONTAINER_BREAKPOINTS.map((breakpoint) => classes.get(breakpoint)).filter(Boolean),\n ].join(' ')\n}\n\nconst FLEX_ROW: Record<string, string> = {\n default: 'flex-row',\n sm: 'sm:flex-row',\n md: 'md:flex-row',\n lg: 'lg:flex-row',\n xl: 'xl:flex-row',\n '2xl': '2xl:flex-row',\n}\n\n/** `Flex::alignment()`: main-axis alignment (logical, so `start` follows the direction). */\nconst FLEX_JUSTIFY: Record<string, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n justify: 'justify-between',\n}\n\nconst FLEX_ALIGN: Record<string, Record<string, string>> = {\n start: {\n default: 'items-start',\n sm: 'sm:items-start',\n md: 'md:items-start',\n lg: 'lg:items-start',\n xl: 'xl:items-start',\n '2xl': '2xl:items-start',\n },\n center: {\n default: 'items-center',\n sm: 'sm:items-center',\n md: 'md:items-center',\n lg: 'lg:items-center',\n xl: 'xl:items-center',\n '2xl': '2xl:items-center',\n },\n end: {\n default: 'items-end',\n sm: 'sm:items-end',\n md: 'md:items-end',\n lg: 'lg:items-end',\n xl: 'xl:items-end',\n '2xl': '2xl:items-end',\n },\n}\n\n/**\n * Classes for a `Flex` schema component: stacked, then a row (and the vertical alignment)\n * from its `from` breakpoint. Force-generated with `@source inline(...)` in each renderer.\n */\nexport function flexLayoutClasses(flex: {\n from?: string | null\n verticalAlignment?: string | null\n alignment?: string | null\n}): string {\n const from = flex.from ?? 'default'\n const align = flex.verticalAlignment ? FLEX_ALIGN[flex.verticalAlignment]?.[from] : undefined\n const justify = flex.alignment ? FLEX_JUSTIFY[flex.alignment] : undefined\n\n return ['flex flex-col gap-6', FLEX_ROW[from] ?? 'flex-row', align, justify]\n .filter(Boolean)\n .join(' ')\n}\n\n/** Width behaviour of a child inside a `Flex`: share the row, or keep its natural width. */\nexport function flexItemClasses(component: { grow?: boolean }): string {\n return component.grow === false ? 'min-w-0 shrink-0' : 'min-w-0 flex-1'\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfakit/core",
3
- "version": "0.1.13",
3
+ "version": "0.2.2",
4
4
  "description": "Framework-agnostic schema types and state management for Alfakit, the Laravel admin panel builder by Alfa Six.",
5
5
  "license": "MIT",
6
6
  "author": "Alfa Six (https://alfasixbh.com)",
package/themes.css CHANGED
@@ -1015,3 +1015,95 @@
1015
1015
  box-shadow: none;
1016
1016
  outline: none;
1017
1017
  }
1018
+
1019
+ /* ------------------------------------------------------------------ CMS site design */
1020
+
1021
+ /*
1022
+ * Public CMS pages (alfasix/alfakit-cms). **Site design** sets the theme variables on the
1023
+ * document root; these rules apply its fonts and each block's **Style** section
1024
+ * (`data-cms-background`, `data-cms-spacing`, `data-cms-visibility` on
1025
+ * `data-slot="cms-block"`). The page keeps copies of its colours so a coloured block can
1026
+ * swap them for its content.
1027
+ */
1028
+ [data-slot='cms-page'] {
1029
+ --cms-primary: var(--primary);
1030
+ --cms-on-primary: var(--primary-foreground);
1031
+ --cms-secondary: var(--secondary);
1032
+ --cms-on-secondary: var(--secondary-foreground);
1033
+ font-family: var(--cms-font-body);
1034
+ }
1035
+
1036
+ /* In-page links (`#pricing`) stop below the sticky site header. */
1037
+ [data-slot='cms-page'] [data-slot='cms-block'][id] {
1038
+ scroll-margin-top: 5rem;
1039
+ }
1040
+
1041
+ [data-slot='cms-page'] :is(h1, h2, h3, h4, h5, h6) {
1042
+ font-family: var(--cms-font-heading, var(--cms-font-body));
1043
+ }
1044
+
1045
+ [data-slot='cms-block'][data-cms-background] {
1046
+ background-color: var(--background);
1047
+ color: var(--foreground);
1048
+ }
1049
+
1050
+ [data-slot='cms-block'][data-cms-background='muted'] {
1051
+ --background: var(--muted);
1052
+ }
1053
+
1054
+ [data-slot='cms-block'][data-cms-background='primary'],
1055
+ [data-slot='cms-block'][data-cms-background='secondary'],
1056
+ [data-slot='cms-block'][data-cms-background='dark'] {
1057
+ --muted: color-mix(in oklab, var(--foreground) 10%, var(--background));
1058
+ --muted-foreground: color-mix(in oklab, var(--foreground) 80%, var(--background));
1059
+ --border: color-mix(in oklab, var(--foreground) 22%, var(--background));
1060
+ --card: color-mix(in oklab, var(--foreground) 7%, var(--background));
1061
+ --card-foreground: var(--foreground);
1062
+ }
1063
+
1064
+ [data-slot='cms-block'][data-cms-background='primary'] {
1065
+ --background: var(--cms-primary);
1066
+ --foreground: var(--cms-on-primary);
1067
+ --primary: var(--cms-on-primary);
1068
+ --primary-foreground: var(--cms-primary);
1069
+ }
1070
+
1071
+ [data-slot='cms-block'][data-cms-background='secondary'] {
1072
+ --background: var(--cms-secondary);
1073
+ --foreground: var(--cms-on-secondary);
1074
+ }
1075
+
1076
+ [data-slot='cms-block'][data-cms-background='dark'] {
1077
+ --background: oklch(0.205 0 0);
1078
+ --foreground: oklch(0.985 0 0);
1079
+ }
1080
+
1081
+ [data-slot='cms-block'][data-cms-spacing='none'] > * {
1082
+ padding-block: 0;
1083
+ }
1084
+
1085
+ [data-slot='cms-block'][data-cms-spacing='small'] > * {
1086
+ padding-block: 1.5rem;
1087
+ }
1088
+
1089
+ [data-slot='cms-block'][data-cms-spacing='large'] > * {
1090
+ padding-block: 6rem;
1091
+ }
1092
+
1093
+ @media (min-width: 640px) {
1094
+ [data-slot='cms-block'][data-cms-spacing='large'] > * {
1095
+ padding-block: 8rem;
1096
+ }
1097
+ }
1098
+
1099
+ @media (max-width: 767.98px) {
1100
+ [data-slot='cms-block'][data-cms-visibility='desktop'] {
1101
+ display: none;
1102
+ }
1103
+ }
1104
+
1105
+ @media (min-width: 768px) {
1106
+ [data-slot='cms-block'][data-cms-visibility='mobile'] {
1107
+ display: none;
1108
+ }
1109
+ }