@starci/grammar 0.4.7 → 0.4.9

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.
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 StarCi
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 StarCi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,46 +1,46 @@
1
- # `@starci/grammar`
2
-
1
+ # `@starci/grammar`
2
+
3
3
  `@starci/grammar` separates one shared, business-free UI contract from sibling visual families.
4
4
  Common owns typed props, semantics, renderer anatomy, universal states/scales, and the family
5
5
  registry. Core, Heritage, and Offset Pop implement that contract with independently scoped visual
6
6
  DNA. The package contains no routes, domain entities, product decisions, or feature-named shells.
7
-
8
- ## Public entry points
9
-
7
+
8
+ ## Public entry points
9
+
10
10
  - `@starci/grammar/common` — shared React renderers, presentation-state helpers, and their CSS. Anonymous layout/action owners include `WorkspaceShell`, `Sidebar`, `Link`, and `TextAction`.
11
11
  - `@starci/grammar/core` — the StarCi Core family, its scoped root, DNA, and compatibility aliases.
12
12
  - `@starci/grammar/heritage` and `@starci/grammar/offset-pop` — sibling family roots,
13
13
  conformance receipts, and scoped visual overlays.
14
14
  - `@starci/grammar/common/styles.css`, `@starci/grammar/core/styles.css`,
15
15
  `@starci/grammar/heritage/styles.css`, and
16
- `@starci/grammar/offset-pop/styles.css` — package stylesheets. Short `.css` export aliases are
17
- also available.
18
-
19
- Install the workspace package while developing locally:
20
-
21
- ```sh
22
- npm install ./packages/grammar
23
- ```
24
-
25
- Import components from the focused entry point:
26
-
27
- ```tsx
16
+ `@starci/grammar/offset-pop/styles.css` — package stylesheets. Short `.css` export aliases are
17
+ also available.
18
+
19
+ Install the workspace package while developing locally:
20
+
21
+ ```sh
22
+ npm install ./packages/grammar
23
+ ```
24
+
25
+ Import components from the focused entry point:
26
+
27
+ ```tsx
28
28
  import {
29
29
  PageContainer,
30
- PrimaryRailLayout,
31
- SurfaceCard,
30
+ PrimaryRailLayout,
31
+ SurfaceCard,
32
32
  } from "@starci/grammar/common"
33
33
  import { CoreGrammarRoot } from "@starci/grammar/core"
34
34
  import "@starci/grammar/core/styles.css"
35
-
36
- export const ProductSurface = () => (
35
+
36
+ export const ProductSurface = () => (
37
37
  <CoreGrammarRoot>
38
- <PageContainer>
39
- <PrimaryRailLayout
40
- primary={<SurfaceCard ariaLabel="Main">...</SurfaceCard>}
41
- rail={<SurfaceCard ariaLabel="Progress">...</SurfaceCard>}
42
- />
43
- </PageContainer>
38
+ <PageContainer>
39
+ <PrimaryRailLayout
40
+ primary={<SurfaceCard ariaLabel="Main">...</SurfaceCard>}
41
+ rail={<SurfaceCard ariaLabel="Progress">...</SurfaceCard>}
42
+ />
43
+ </PageContainer>
44
44
  </CoreGrammarRoot>
45
45
  )
46
46
  ```
@@ -56,24 +56,24 @@ Heritage and Offset Pop replace only the neutral family root; every other Common
56
56
  contract is inherited. Each family stylesheet imports Common anatomy directly and never imports a
57
57
  sibling family stylesheet.
58
58
 
59
- `IncludedMark` is the purpose-named 20px outlined circle-check for included offering content; it
60
- inherits foreground and never claims completion. `SurfaceCopyGroup` packages Core's compact `0.5rem`
61
- title/explanation rhythm. A `SurfaceCard` without `wholeAction` identifies itself as `static`, which
62
- is the appropriate comparison surface when its short facts must remain visible together.
63
-
59
+ `IncludedMark` is the purpose-named 20px outlined circle-check for included offering content; it
60
+ inherits foreground and never claims completion. `SurfaceCopyGroup` packages Core's compact `0.5rem`
61
+ title/explanation rhythm. A `SurfaceCard` without `wholeAction` identifies itself as `static`, which
62
+ is the appropriate comparison surface when its short facts must remain visible together.
63
+
64
64
  Common components accept ordinary typed React props and keep semantic DOM and accessibility behavior.
65
65
  The application translates business data into those props; a family changes presentation only.
66
66
  `MediaFrame` presents an already selected asset and never decides whether to generate one. The
67
67
  machine-checkable `COMMON_UI_RULE_IDS`/`defineGrammarRuleConformance` boundary verifies that each
68
68
  family accounts for the canonical UI X-n catalog without copying the laws into package code.
69
-
70
- ## Package checks
71
-
72
- ```sh
73
- npm run typecheck
74
- npm test
75
- npm pack --dry-run
76
- ```
77
-
78
- The package requires Node.js 20 or newer and has peer dependencies on React 18+ and
79
- `@heroui/react` 3.2+.
69
+
70
+ ## Package checks
71
+
72
+ ```sh
73
+ npm run typecheck
74
+ npm test
75
+ npm pack --dry-run
76
+ ```
77
+
78
+ The package requires Node.js 20 or newer and has peer dependencies on React 18+ and
79
+ `@heroui/react` 3.2+.
@@ -1195,10 +1195,17 @@
1195
1195
  }
1196
1196
 
1197
1197
  @container starci-core-primary-rail (max-width: 32rem) {
1198
+ /*
1199
+ * Collapsed to a column, the header stays a region boundary, not a tighter internal
1200
+ * rhythm - `PrimaryRailLayout` and `WorkspaceShell` both hold `--starci-core-region-gap`
1201
+ * across every collapse tier and only ever change track/area, never the gap itself. The
1202
+ * stamped `data-contract="GAP-5"` on this root must stay true here too, so this rule may
1203
+ * change direction and alignment but not the gap value.
1204
+ */
1198
1205
  .starci-core-section-header {
1199
1206
  align-items: flex-start;
1200
1207
  flex-direction: column;
1201
- gap: 0.75rem;
1208
+ gap: var(--starci-core-region-gap, 1.5rem);
1202
1209
  }
1203
1210
  }
1204
1211
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/branch/Tabs/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAUpF,mEAAmE;AACnE,MAAM,MAAM,OAAO,GAAG;IAClB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAC/B,CAAA;AAED,8EAA8E;AAC9E,MAAM,MAAM,SAAS,GAAG;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAC1C,4FAA4F;IAC5F,QAAQ,CAAC,eAAe,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAA;IAClD,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACnC,CAAA;AAED,qFAAqF;AACrF,eAAO,MAAM,IAAI,GAAI,OAAO,SAAS,gCAgDpC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/branch/Tabs/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAUpF,mEAAmE;AACnE,MAAM,MAAM,OAAO,GAAG;IAClB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAC/B,CAAA;AAED,8EAA8E;AAC9E,MAAM,MAAM,SAAS,GAAG;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAC1C,4FAA4F;IAC5F,QAAQ,CAAC,eAAe,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAA;IAClD,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACnC,CAAA;AAED,qFAAqF;AACrF,eAAO,MAAM,IAAI,GAAI,OAAO,SAAS,gCAwEpC,CAAA"}
@@ -10,19 +10,47 @@ export const Tabs = (props) => {
10
10
  const frameRef = useRef(null);
11
11
  useEffect(() => setIsClientReady(true), []);
12
12
  useLayoutEffect(() => {
13
- if (!isClientReady || props.panelId === undefined)
13
+ const frame = frameRef.current;
14
+ const panelId = props.panelId;
15
+ if (!isClientReady || frame === null || panelId === undefined)
14
16
  return;
15
- frameRef.current?.querySelectorAll("[data-grammar-tab-id]").forEach((identity) => {
16
- const itemId = identity.dataset.grammarTabId;
17
- const tab = identity.closest("[role='tab']");
18
- if (itemId !== undefined && tab !== null)
19
- tab.setAttribute("aria-controls", props.panelId?.(itemId) ?? "");
20
- });
21
- }, [isClientReady, props.items, props.panelId]);
17
+ // HeroUI's collection may mount or update after this layout effect. Observe
18
+ // only the owned relationship, preserving the actual vendor value for cleanup.
19
+ const relationships = new Map();
20
+ const syncPanelIds = () => {
21
+ frame.querySelectorAll("[data-grammar-tab-id]").forEach((identity) => {
22
+ const itemId = identity.dataset.grammarTabId;
23
+ const tab = identity.closest("[role='tab']");
24
+ if (itemId === undefined || tab === null)
25
+ return;
26
+ const current = tab.getAttribute("aria-controls");
27
+ const previous = relationships.get(tab);
28
+ const expected = panelId(itemId);
29
+ const original = previous !== undefined && current === previous.applied ? previous.original : current;
30
+ relationships.set(tab, { original, applied: expected });
31
+ if (current !== expected)
32
+ tab.setAttribute("aria-controls", expected);
33
+ });
34
+ };
35
+ const observer = new MutationObserver(syncPanelIds);
36
+ observer.observe(frame, { childList: true, subtree: true, attributes: true, attributeFilter: ["aria-controls", "data-grammar-tab-id"] });
37
+ syncPanelIds();
38
+ return () => {
39
+ observer.disconnect();
40
+ relationships.forEach(({ original, applied }, tab) => {
41
+ if (tab.getAttribute("aria-controls") !== applied)
42
+ return;
43
+ if (original === null)
44
+ tab.removeAttribute("aria-controls");
45
+ else
46
+ tab.setAttribute("aria-controls", original);
47
+ });
48
+ };
49
+ }, [isClientReady, props.items, props.panelId, props.selectedKey]);
22
50
  const inset = props.inset ?? "none";
23
51
  const frameContract = inset === "page" ? "PADDING-5" : undefined;
24
52
  if (!isClientReady)
25
53
  return _jsx("div", { "aria-hidden": "true", className: tabsFrameClassName, "data-contract": frameContract, "data-grammar-tabs": "true", "data-grammar-tabs-client": "pending", "data-grammar-tabs-inset": inset, style: { minHeight: "3rem" } });
26
- return _jsx("div", { ref: frameRef, className: tabsFrameClassName, "data-contract": frameContract, "data-grammar-tabs": "true", "data-grammar-tabs-client": "ready", "data-grammar-tabs-inset": inset, "data-grammar-tab-labels": props.labelVisibility ?? "responsive", children: _jsx(HorizontalScrollRegion, { className: tabsScrollClassName, "data-contract": "OVERFLOW-4", "data-grammar-tabs-overflow": "scroll", hideScrollBar: true, children: _jsx(HeroTabs, { variant: "secondary", selectedKey: props.selectedKey, onSelectionChange: (key) => props.onSelect?.(String(key)), className: tabsClassName ?? "", "data-contract": "FLOW-2", children: _jsx(HeroTabs.ListContainer, { children: _jsx(HeroTabs.List, { "aria-label": props.label, children: props.items.map((item) => (_jsxs(HeroTabs.Tab, { id: item.id, "aria-label": item.label, "aria-controls": props.panelId?.(item.id), "data-contract": "PADDING-3", children: [_jsxs("span", { className: tabContentClassName, "data-contract": "GAP-2", "data-grammar-tab-id": item.id, children: [item.leading, _jsx("span", { className: tabLabelClassName, style: props.labelVisibility === "always" ? { display: "inline" } : undefined, children: item.label })] }), _jsx(HeroTabs.Indicator, {})] }, item.id))) }) }) }) }) });
54
+ return _jsx("div", { ref: frameRef, className: tabsFrameClassName, "data-contract": frameContract, "data-grammar-tabs": "true", "data-grammar-tabs-client": "ready", "data-grammar-tabs-inset": inset, "data-grammar-tab-labels": props.labelVisibility ?? "responsive", children: _jsx(HorizontalScrollRegion, { className: tabsScrollClassName, "data-contract": "OVERFLOW-4", "data-grammar-tabs-overflow": "scroll", hideScrollBar: true, children: _jsx(HeroTabs, { variant: "secondary", selectedKey: props.selectedKey, onSelectionChange: (key) => props.onSelect?.(String(key)), className: tabsClassName ?? "", "data-contract": "FLOW-2", children: _jsx(HeroTabs.ListContainer, { children: _jsx(HeroTabs.List, { "aria-label": props.label, children: props.items.map((item) => (_jsxs(HeroTabs.Tab, { id: item.id, "aria-label": item.label, "data-contract": "PADDING-3", children: [_jsxs("span", { className: tabContentClassName, "data-contract": "GAP-2", "data-grammar-tab-id": item.id, children: [item.leading, _jsx("span", { className: tabLabelClassName, style: props.labelVisibility === "always" ? { display: "inline" } : undefined, children: item.label })] }), _jsx(HeroTabs.Indicator, {})] }, item.id))) }) }) }) }) });
27
55
  };
28
56
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/branch/Tabs/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/branch/Tabs/index.tsx"],"names":[],"mappings":"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"}
@@ -1,97 +1,97 @@
1
1
  @import "../common/styles.css";
2
2
 
3
3
  @layer starci-grammar-core {
4
- /*
5
- * StarCi visual DNA is opt-in through GrammarRoot. It supplies a complete,
6
- * portable semantic theme while keeping product/UI laws out of CSS.
7
- */
4
+ /*
5
+ * StarCi visual DNA is opt-in through GrammarRoot. It supplies a complete,
6
+ * portable semantic theme while keeping product/UI laws out of CSS.
7
+ */
8
8
  .grammar-common-root[data-grammar-family="core"] {
9
- color-scheme: light;
10
-
11
- --starci-core-accent: #7547ff;
12
- --starci-core-accent-foreground: oklch(100% 0 0);
13
- --starci-core-focus: #7248ff;
14
- --starci-core-canvas: oklch(97.02% 0.0015 354.13);
15
- --starci-core-surface: oklch(100% 0.0008 354.13);
16
- --starci-core-surface-secondary: oklch(95.24% 0.0012 354.13);
17
- --starci-core-foreground: oklch(21.03% 0.0015 354.13);
18
- --starci-core-muted: oklch(55.17% 0.003 354.13);
19
- --starci-core-border: oklch(90% 0.0015 354.13);
20
- --starci-core-separator: oklch(92% 0.0015 354.13);
21
- --starci-core-success: oklch(73.29% 0.1941 162.85);
22
- --starci-core-success-foreground: oklch(21.03% 0.0059 162.85);
23
- --starci-core-warning: oklch(78.19% 0.159 84.37);
24
- --starci-core-warning-foreground: oklch(21.03% 0.0059 84.37);
25
- --starci-core-danger: oklch(65.32% 0.2335 37.78);
26
- --starci-core-danger-foreground: oklch(99.11% 0 0);
27
- --starci-core-info: oklch(72% 0.17 250);
28
- --starci-core-info-foreground: oklch(21.03% 0.0059 250);
29
- --starci-core-page-measure: 80rem;
30
- --starci-core-reading-measure: 72ch;
9
+ color-scheme: light;
10
+
11
+ --starci-core-accent: #7547ff;
12
+ --starci-core-accent-foreground: oklch(100% 0 0);
13
+ --starci-core-focus: #7248ff;
14
+ --starci-core-canvas: oklch(97.02% 0.0015 354.13);
15
+ --starci-core-surface: oklch(100% 0.0008 354.13);
16
+ --starci-core-surface-secondary: oklch(95.24% 0.0012 354.13);
17
+ --starci-core-foreground: oklch(21.03% 0.0015 354.13);
18
+ --starci-core-muted: oklch(55.17% 0.003 354.13);
19
+ --starci-core-border: oklch(90% 0.0015 354.13);
20
+ --starci-core-separator: oklch(92% 0.0015 354.13);
21
+ --starci-core-success: oklch(73.29% 0.1941 162.85);
22
+ --starci-core-success-foreground: oklch(21.03% 0.0059 162.85);
23
+ --starci-core-warning: oklch(78.19% 0.159 84.37);
24
+ --starci-core-warning-foreground: oklch(21.03% 0.0059 84.37);
25
+ --starci-core-danger: oklch(65.32% 0.2335 37.78);
26
+ --starci-core-danger-foreground: oklch(99.11% 0 0);
27
+ --starci-core-info: oklch(72% 0.17 250);
28
+ --starci-core-info-foreground: oklch(21.03% 0.0059 250);
29
+ --starci-core-page-measure: 80rem;
30
+ --starci-core-reading-measure: 72ch;
31
31
  --starci-core-page-inset: var(--grammar-page-inset);
32
32
  --starci-core-region-gap: var(--grammar-region-gap);
33
33
  --starci-core-section-gap: var(--grammar-section-gap);
34
34
  --starci-core-inline-gap: var(--grammar-inline-gap);
35
35
  --starci-core-row-gap: var(--grammar-row-gap);
36
- --starci-core-surface-radius: 1rem;
37
- --starci-core-control-radius: 0.75rem;
38
- --starci-core-pill-radius: 999px;
39
- --starci-core-surface-shadow: 0 8px 28px oklch(21.03% 0.0059 354.13 / 0.07);
40
- --starci-core-motion-duration: 180ms;
41
- --starci-core-motion-easing: cubic-bezier(0.2, 0, 0, 1);
42
-
43
- /* HeroUI and existing Grammar anatomy resolve through the same DNA. */
44
- --accent: var(--starci-core-accent);
45
- --accent-foreground: var(--starci-core-accent-foreground);
46
- --focus: var(--starci-core-focus);
47
- --background: var(--starci-core-canvas);
48
- --foreground: var(--starci-core-foreground);
49
- --surface: var(--starci-core-surface);
50
- --surface-foreground: var(--starci-core-foreground);
51
- --surface-secondary: var(--starci-core-surface-secondary);
52
- --surface-secondary-foreground: var(--starci-core-foreground);
53
- --muted: var(--starci-core-muted);
54
- --border: var(--starci-core-border);
55
- --separator: var(--starci-core-separator);
56
- --success: var(--starci-core-success);
57
- --success-foreground: var(--starci-core-success-foreground);
58
- --warning: var(--starci-core-warning);
59
- --warning-foreground: var(--starci-core-warning-foreground);
60
- --danger: var(--starci-core-danger);
61
- --danger-foreground: var(--starci-core-danger-foreground);
62
- --info: var(--starci-core-info);
63
- --info-foreground: var(--starci-core-info-foreground);
64
- --field-background: var(--starci-core-surface);
65
- --field-border: transparent;
66
- --field-foreground: var(--starci-core-foreground);
67
- --field-placeholder: var(--starci-core-muted);
68
- --radius: var(--starci-core-control-radius);
69
- --field-radius: var(--starci-core-control-radius);
70
- --shadow-surface: var(--starci-core-surface-shadow);
71
-
72
- min-width: 0;
73
- background: var(--starci-core-canvas);
74
- color: var(--starci-core-foreground);
75
- font-family: var(--starci-font-sans, ui-sans-serif, system-ui, sans-serif);
76
- }
77
-
36
+ --starci-core-surface-radius: 1rem;
37
+ --starci-core-control-radius: 0.75rem;
38
+ --starci-core-pill-radius: 999px;
39
+ --starci-core-surface-shadow: 0 8px 28px oklch(21.03% 0.0059 354.13 / 0.07);
40
+ --starci-core-motion-duration: 180ms;
41
+ --starci-core-motion-easing: cubic-bezier(0.2, 0, 0, 1);
42
+
43
+ /* HeroUI and existing Grammar anatomy resolve through the same DNA. */
44
+ --accent: var(--starci-core-accent);
45
+ --accent-foreground: var(--starci-core-accent-foreground);
46
+ --focus: var(--starci-core-focus);
47
+ --background: var(--starci-core-canvas);
48
+ --foreground: var(--starci-core-foreground);
49
+ --surface: var(--starci-core-surface);
50
+ --surface-foreground: var(--starci-core-foreground);
51
+ --surface-secondary: var(--starci-core-surface-secondary);
52
+ --surface-secondary-foreground: var(--starci-core-foreground);
53
+ --muted: var(--starci-core-muted);
54
+ --border: var(--starci-core-border);
55
+ --separator: var(--starci-core-separator);
56
+ --success: var(--starci-core-success);
57
+ --success-foreground: var(--starci-core-success-foreground);
58
+ --warning: var(--starci-core-warning);
59
+ --warning-foreground: var(--starci-core-warning-foreground);
60
+ --danger: var(--starci-core-danger);
61
+ --danger-foreground: var(--starci-core-danger-foreground);
62
+ --info: var(--starci-core-info);
63
+ --info-foreground: var(--starci-core-info-foreground);
64
+ --field-background: var(--starci-core-surface);
65
+ --field-border: transparent;
66
+ --field-foreground: var(--starci-core-foreground);
67
+ --field-placeholder: var(--starci-core-muted);
68
+ --radius: var(--starci-core-control-radius);
69
+ --field-radius: var(--starci-core-control-radius);
70
+ --shadow-surface: var(--starci-core-surface-shadow);
71
+
72
+ min-width: 0;
73
+ background: var(--starci-core-canvas);
74
+ color: var(--starci-core-foreground);
75
+ font-family: var(--starci-font-sans, ui-sans-serif, system-ui, sans-serif);
76
+ }
77
+
78
78
  .grammar-common-root[data-grammar-family="core"][data-grammar-theme="dark"] {
79
- color-scheme: dark;
80
- --starci-core-canvas: oklch(12% 0.0015 354.13);
81
- --starci-core-surface: oklch(21.03% 0.003 354.13);
82
- --starci-core-surface-secondary: oklch(25.7% 0.0023 354.13);
83
- --starci-core-foreground: oklch(99.11% 0.0015 354.13);
84
- --starci-core-muted: oklch(70.5% 0.003 354.13);
85
- --starci-core-border: oklch(28% 0.0015 354.13);
86
- --starci-core-separator: oklch(25% 0.0015 354.13);
87
- --starci-core-success: oklch(73.29% 0.1941 162.85);
88
- --starci-core-success-foreground: oklch(21.03% 0.0059 162.85);
89
- --starci-core-warning: oklch(82.03% 0.1392 88.38);
90
- --starci-core-warning-foreground: oklch(21.03% 0.0059 88.38);
91
- --starci-core-danger: oklch(59.4% 0.1973 36.67);
92
- --starci-core-danger-foreground: oklch(99.11% 0 0);
93
- --starci-core-info: oklch(72% 0.17 250);
94
- --starci-core-info-foreground: oklch(21.03% 0.0059 250);
79
+ color-scheme: dark;
80
+ --starci-core-canvas: oklch(12% 0.0015 354.13);
81
+ --starci-core-surface: oklch(21.03% 0.003 354.13);
82
+ --starci-core-surface-secondary: oklch(25.7% 0.0023 354.13);
83
+ --starci-core-foreground: oklch(99.11% 0.0015 354.13);
84
+ --starci-core-muted: oklch(70.5% 0.003 354.13);
85
+ --starci-core-border: oklch(28% 0.0015 354.13);
86
+ --starci-core-separator: oklch(25% 0.0015 354.13);
87
+ --starci-core-success: oklch(73.29% 0.1941 162.85);
88
+ --starci-core-success-foreground: oklch(21.03% 0.0059 162.85);
89
+ --starci-core-warning: oklch(82.03% 0.1392 88.38);
90
+ --starci-core-warning-foreground: oklch(21.03% 0.0059 88.38);
91
+ --starci-core-danger: oklch(59.4% 0.1973 36.67);
92
+ --starci-core-danger-foreground: oklch(99.11% 0 0);
93
+ --starci-core-info: oklch(72% 0.17 250);
94
+ --starci-core-info-foreground: oklch(21.03% 0.0059 250);
95
95
  }
96
96
 
97
97
  /* StarCi labelled surfaces paint one material box around label and content. */
@@ -121,49 +121,49 @@
121
121
  background: transparent;
122
122
  box-shadow: none;
123
123
  }
124
-
125
- @media (prefers-color-scheme: dark) {
124
+
125
+ @media (prefers-color-scheme: dark) {
126
126
  .grammar-common-root[data-grammar-family="core"][data-grammar-theme="system"] {
127
- color-scheme: dark;
128
- --starci-core-canvas: oklch(12% 0.0015 354.13);
129
- --starci-core-surface: oklch(21.03% 0.003 354.13);
130
- --starci-core-surface-secondary: oklch(25.7% 0.0023 354.13);
131
- --starci-core-foreground: oklch(99.11% 0.0015 354.13);
132
- --starci-core-muted: oklch(70.5% 0.003 354.13);
133
- --starci-core-border: oklch(28% 0.0015 354.13);
134
- --starci-core-separator: oklch(25% 0.0015 354.13);
135
- --starci-core-success: oklch(73.29% 0.1941 162.85);
136
- --starci-core-success-foreground: oklch(21.03% 0.0059 162.85);
137
- --starci-core-warning: oklch(82.03% 0.1392 88.38);
138
- --starci-core-warning-foreground: oklch(21.03% 0.0059 88.38);
139
- --starci-core-danger: oklch(59.4% 0.1973 36.67);
140
- --starci-core-danger-foreground: oklch(99.11% 0 0);
141
- --starci-core-info: oklch(72% 0.17 250);
142
- --starci-core-info-foreground: oklch(21.03% 0.0059 250);
143
- }
144
- }
145
-
146
- @media (forced-colors: active) {
127
+ color-scheme: dark;
128
+ --starci-core-canvas: oklch(12% 0.0015 354.13);
129
+ --starci-core-surface: oklch(21.03% 0.003 354.13);
130
+ --starci-core-surface-secondary: oklch(25.7% 0.0023 354.13);
131
+ --starci-core-foreground: oklch(99.11% 0.0015 354.13);
132
+ --starci-core-muted: oklch(70.5% 0.003 354.13);
133
+ --starci-core-border: oklch(28% 0.0015 354.13);
134
+ --starci-core-separator: oklch(25% 0.0015 354.13);
135
+ --starci-core-success: oklch(73.29% 0.1941 162.85);
136
+ --starci-core-success-foreground: oklch(21.03% 0.0059 162.85);
137
+ --starci-core-warning: oklch(82.03% 0.1392 88.38);
138
+ --starci-core-warning-foreground: oklch(21.03% 0.0059 88.38);
139
+ --starci-core-danger: oklch(59.4% 0.1973 36.67);
140
+ --starci-core-danger-foreground: oklch(99.11% 0 0);
141
+ --starci-core-info: oklch(72% 0.17 250);
142
+ --starci-core-info-foreground: oklch(21.03% 0.0059 250);
143
+ }
144
+ }
145
+
146
+ @media (forced-colors: active) {
147
147
  .grammar-common-root[data-grammar-family="core"] {
148
- --starci-core-accent: Highlight;
149
- --starci-core-focus: Highlight;
150
- --starci-core-canvas: Canvas;
151
- --starci-core-surface: Canvas;
152
- --starci-core-surface-secondary: Canvas;
153
- --starci-core-foreground: CanvasText;
154
- --starci-core-muted: GrayText;
155
- --starci-core-border: CanvasText;
156
- --starci-core-separator: CanvasText;
157
- --starci-core-success: CanvasText;
158
- --starci-core-success-foreground: Canvas;
159
- --starci-core-warning: CanvasText;
160
- --starci-core-warning-foreground: Canvas;
161
- --starci-core-danger: CanvasText;
162
- --starci-core-danger-foreground: Canvas;
163
- --starci-core-info: CanvasText;
164
- --starci-core-info-foreground: Canvas;
165
- --starci-core-surface-shadow: none;
166
- }
167
- }
168
- }
169
-
148
+ --starci-core-accent: Highlight;
149
+ --starci-core-focus: Highlight;
150
+ --starci-core-canvas: Canvas;
151
+ --starci-core-surface: Canvas;
152
+ --starci-core-surface-secondary: Canvas;
153
+ --starci-core-foreground: CanvasText;
154
+ --starci-core-muted: GrayText;
155
+ --starci-core-border: CanvasText;
156
+ --starci-core-separator: CanvasText;
157
+ --starci-core-success: CanvasText;
158
+ --starci-core-success-foreground: Canvas;
159
+ --starci-core-warning: CanvasText;
160
+ --starci-core-warning-foreground: Canvas;
161
+ --starci-core-danger: CanvasText;
162
+ --starci-core-danger-foreground: Canvas;
163
+ --starci-core-info: CanvasText;
164
+ --starci-core-info-foreground: Canvas;
165
+ --starci-core-surface-shadow: none;
166
+ }
167
+ }
168
+ }
169
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starci/grammar",
3
- "version": "0.4.7",
3
+ "version": "0.4.9",
4
4
  "description": "Reusable StarCi React components, compositions, and packaged visual DNA.",
5
5
  "keywords": [
6
6
  "starci",