studio-engine 0.114.3.rc1 → 0.115.0.rc1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +35 -0
- data/README.md +16 -18
- data/app/assets/tailwind/studio_engine/theme.css +1 -1
- data/lib/studio/version.rb +1 -1
- data/studio-engine.gemspec +1 -1
- metadata +1 -2
- data/tailwind/studio.tailwind.config.js +0 -141
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '0899e08c1d3bce3e63d3f1c6cef0fa178c47d30a80ccb5246e7155d12f46eec9'
|
|
4
|
+
data.tar.gz: 933f3be8adef99b85196b1e873859b665d676fcc9c26af6cfb15ab4e32460293
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 59cb10068b65ceb8ef9f46cbaddaa6e998c3117a00bda165e2cbdc3ffaf8e43fa2bca65f0843d3e3740437e2ed3d0f7e4d034c2af41319884d2ec4bedb9f30b4
|
|
7
|
+
data.tar.gz: 1b9fafe6b140123496e4ce5fbcae20529adb6a3c358fd30fa5d027b9f7828c7a8f60e1480720a3931f2ae44ee84f43f3f2a9fa90687214768c5c908d36a59b0a
|
data/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,41 @@ The format is [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). This pro
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.115.0 — 2026-10-26
|
|
8
|
+
|
|
9
|
+
### Breaking
|
|
10
|
+
|
|
11
|
+
- **The deprecated JS Tailwind preset `tailwind/studio.tailwind.config.js` is
|
|
12
|
+
deleted**, with its parity test (`test/integration/tailwind_preset_parity_test.rb`),
|
|
13
|
+
and the gemspec no longer packages a `tailwind/` directory. Every host in the
|
|
14
|
+
release relock set had already moved to the CSS-first entry (hub, Turf
|
|
15
|
+
Monster, Rantly, McRitchie Industries, Cyvasse, Moms App, Alex Build,
|
|
16
|
+
Commercial Welding), so none of them reads it. The one known
|
|
17
|
+
holdout is acquisition-studio, pinned to 0.24.0 and outside the relock set;
|
|
18
|
+
it migrates on its next bump.
|
|
19
|
+
**Upgrade note for a host still on `@config` + the preset** (its
|
|
20
|
+
`config/tailwind.config.js` `require`s
|
|
21
|
+
`${studioPath}/tailwind/studio.tailwind.config.js`): bumping past 0.114.3
|
|
22
|
+
fails its Tailwind build, because the file is gone. Switch to the CSS-first
|
|
23
|
+
entry in the same change as the bump:
|
|
24
|
+
1. Make `app/assets/tailwind/application.css` start with `@import
|
|
25
|
+
"tailwindcss";` and `@import "../builds/tailwind/studio_engine";`, and
|
|
26
|
+
delete its `@config` line (and any `studio_engine_motion` import).
|
|
27
|
+
2. Delete `config/tailwind.config.js` and
|
|
28
|
+
`lib/tasks/tailwindcss_engine_motion.rake`, moving only the host's own
|
|
29
|
+
theme extensions into an `@theme inline { ... }` block after the import.
|
|
30
|
+
3. Rebuild with `bin/rails tailwindcss:build` and check that the class set of
|
|
31
|
+
`app/assets/builds/tailwind.css` only grew.
|
|
32
|
+
The full recipe, with the safelist and `vendor/bundle` cases: README,
|
|
33
|
+
"Migrating a host from `@config`".
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- README lists every host, and `docs/NEW_APP_SETUP.md` section 16's apt
|
|
38
|
+
install sample carries the hardened pattern (apt retries and 30s fetch
|
|
39
|
+
timeouts, a bounded step, three attempts), so a new app's first CI does not
|
|
40
|
+
hang on a stalled mirror.
|
|
41
|
+
|
|
7
42
|
## 0.114.3 — 2026-10-26
|
|
8
43
|
|
|
9
44
|
## 0.114.2 — 2026-10-26
|
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Studio Engine
|
|
2
2
|
|
|
3
|
-
Shared Rails engine for McRitchie apps. Provides authentication, error handling, dynamic theming, and common concerns used by [McRitchie Studio](https://app.mcritchie.studio)
|
|
3
|
+
Shared Rails engine for McRitchie apps. Provides authentication, error handling, dynamic theming, and common concerns used by [McRitchie Studio](https://app.mcritchie.studio), [Turf Monster](https://app.turfmonster.media) and the other McRitchie hosts: Rantly, McRitchie Industries, Cyvasse, Moms App, Alex Build and Commercial Welding.
|
|
4
4
|
|
|
5
5
|
> **Part of the McRitchie ecosystem** — see [`ECOSYSTEM.md`](https://github.com/McRitchie-Studio/mcritchie-studio/blob/main/docs/ECOSYSTEM.md) for the 5-repo map; [`house-burn-down.md`](https://github.com/McRitchie-Studio/mcritchie-studio/blob/main/docs/agents/system/house-burn-down.md) for fresh-Mac recovery.
|
|
6
6
|
|
|
@@ -24,8 +24,9 @@ rather than constraining the resolve — read the `Gemfile.lock` for what really
|
|
|
24
24
|
resolved.
|
|
25
25
|
|
|
26
26
|
> Published to RubyGems as of v0.4.0 (2026-05-17). New installs should use the
|
|
27
|
-
> RubyGems form, which
|
|
28
|
-
> `turf-monster`, `mcritchie-industries`
|
|
27
|
+
> RubyGems form, which every consumer Rails app (`mcritchie-studio`,
|
|
28
|
+
> `turf-monster`, `rantly`, `mcritchie-industries`, `cyvasse`, `moms-app`,
|
|
29
|
+
> `alex-build`, `commercial-welding`) already uses.
|
|
29
30
|
|
|
30
31
|
## What It Provides
|
|
31
32
|
|
|
@@ -64,7 +65,7 @@ wire by hand:
|
|
|
64
65
|
|
|
65
66
|
| What | Where it lives | What it replaced |
|
|
66
67
|
|------|----------------|------------------|
|
|
67
|
-
| The design tokens (surfaces, inks, the primary ladder, brand palettes, `text-2xs`/`text-3xs`, Montserrat) and the class-based `dark:` variant | `theme.css`, `@theme inline reference` | `tailwind/studio.tailwind.config.js` and the host's `@config` |
|
|
68
|
+
| The design tokens (surfaces, inks, the primary ladder, brand palettes, `text-2xs`/`text-3xs`, Montserrat) and the class-based `dark:` variant | `theme.css`, `@theme inline reference` | the deleted JS preset `tailwind/studio.tailwind.config.js` and the host's `@config` |
|
|
68
69
|
| The scan of every engine directory that emits a class (views, components, helpers, both JavaScript trees) | `host.css`, `@source` | the host's content glob over the gem's views, found with a bundler call from Node |
|
|
69
70
|
| Every engine class, with no safelist | the scan above; no class is assembled at render time | the host's primary-colour safelist (about 240 classes) |
|
|
70
71
|
| The motion, effect and leveling primitives (`.spinner`, `.hold-btn`, `.level-badge-*`, ...) | `engine-motion.css`, imported last by `host.css` | `lib/tasks/tailwindcss_engine_motion.rake` and its `studio_engine_motion` import |
|
|
@@ -81,14 +82,12 @@ by path, such as the hub's client kit (`ClientApps::StudioKit::Css`, held to
|
|
|
81
82
|
|
|
82
83
|
### Migrating a host from `@config`
|
|
83
84
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
through its own generated import). The duplicate is harmless and goes with
|
|
91
|
-
step 3.
|
|
85
|
+
Every host has migrated: hub, Turf Monster, Rantly, McRitchie Industries,
|
|
86
|
+
Cyvasse, Moms App, Alex Build and Commercial Welding.
|
|
87
|
+
The deprecated JS preset `tailwind/studio.tailwind.config.js` and its parity
|
|
88
|
+
test are **deleted**, so a host still on `@config` that bumps the gem past
|
|
89
|
+
0.114.3 fails at its own Tailwind build (`require` of a file the gem no longer
|
|
90
|
+
ships). Run this recipe in the same change as that bump (CHANGELOG, Breaking).
|
|
92
91
|
|
|
93
92
|
1. **Bump** `studio-engine` to the release that carries this section.
|
|
94
93
|
2. **`application.css`**: delete the `@config` line. Keep `@import
|
|
@@ -124,11 +123,9 @@ step 3.
|
|
|
124
123
|
engine now also scans its helpers and scripts). Spot-check one class from
|
|
125
124
|
each column above: `.text-heading`, `.btn-primary`, `.spinner`.
|
|
126
125
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
runtime to build the client kit CSS, and a few host tests read its text
|
|
131
|
-
(CHANGELOG, Deprecated).
|
|
126
|
+
A migrating host also moves every other reader of the preset, not only the
|
|
127
|
+
build: any production code or test that `require`s or reads the preset's text
|
|
128
|
+
reads `theme.css` instead.
|
|
132
129
|
|
|
133
130
|
## Configuration
|
|
134
131
|
|
|
@@ -1057,7 +1054,8 @@ config.navbar_z_tier = true # the live header at z-[var(--z-nav)], not z-50
|
|
|
1057
1054
|
wins when both are set. Rules: `lib/studio/navbar_brand.rb`.
|
|
1058
1055
|
- **The word classes live in the host's initializer**
|
|
1059
1056
|
(`config/initializers/studio.rb`), which a host's Tailwind scan may not
|
|
1060
|
-
read (
|
|
1057
|
+
read (Tailwind's automatic detection and the engine's own `@source` lines
|
|
1058
|
+
may both miss it). A utility
|
|
1061
1059
|
named only there, `text-heading` say, compiles only if some view also uses
|
|
1062
1060
|
it. Add the initializer to the scan (`@source "../../../config/initializers/studio.rb";`),
|
|
1063
1061
|
or give the word a class the host's CSS defines (`tm-wordmark`). See
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
2
|
studio-engine THEME — the shared Tailwind v4 design tokens, CSS-first.
|
|
3
3
|
|
|
4
|
-
This file replaced tailwind/studio.tailwind.config.js (the JS preset every
|
|
4
|
+
This file replaced tailwind/studio.tailwind.config.js (since deleted; the JS preset every
|
|
5
5
|
consumer spread through `@config`, after shelling out to bundler from Node to
|
|
6
6
|
find the gem). engine.css imports it (and host.css imports engine.css), so a
|
|
7
7
|
consumer gets these tokens from the same one line that brings the component
|
data/lib/studio/version.rb
CHANGED
data/studio-engine.gemspec
CHANGED
|
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
|
|
|
30
30
|
# citation should resolve in the installed gem, not only on GitHub. The rest of
|
|
31
31
|
# docs/ is the engine's own operating material. Guarded by
|
|
32
32
|
# test/lib/gemspec_ships_footer_docs_test.rb.
|
|
33
|
-
spec.files = Dir["lib/**/*", "app/**/*", "config/**/*", "db/**/*", "
|
|
33
|
+
spec.files = Dir["lib/**/*", "app/**/*", "config/**/*", "db/**/*", "Gemfile", "studio-engine.gemspec", "README.md", "CHANGELOG.md", "LICENSE",
|
|
34
34
|
"docs/SITE_FOOTER.md", "docs/BOOKING.md"] - ["config/e2e_lane.yml"]
|
|
35
35
|
spec.require_paths = ["lib"]
|
|
36
36
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: studio-engine
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.115.0.rc1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Alex McRitchie
|
|
@@ -801,7 +801,6 @@ files:
|
|
|
801
801
|
- lib/tasks/studio_knowledge.rake
|
|
802
802
|
- lib/tasks/studio_trash.rake
|
|
803
803
|
- studio-engine.gemspec
|
|
804
|
-
- tailwind/studio.tailwind.config.js
|
|
805
804
|
homepage: https://github.com/McRitchie-Studio/studio-engine
|
|
806
805
|
licenses:
|
|
807
806
|
- MIT
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
// DEPRECATED — kept for ONE release so consumers can adopt on their own cards.
|
|
2
|
-
//
|
|
3
|
-
// The engine's Tailwind layer is CSS-first: the tokens below now live in
|
|
4
|
-
// app/assets/tailwind/studio_engine/theme.css (@theme), and every host gets
|
|
5
|
-
// them, the engine's @source scan and the motion layer from its one
|
|
6
|
-
// `@import "../builds/tailwind/studio_engine";` line. Nothing in the engine
|
|
7
|
-
// reads this file any more. A host still on `@config` + this preset builds
|
|
8
|
-
// exactly as before; test/integration/tailwind_preset_parity_test.rb holds it
|
|
9
|
-
// to the same utilities as theme.css until it goes.
|
|
10
|
-
//
|
|
11
|
-
// Migration (README, "Tailwind"): drop the host's `@config` line,
|
|
12
|
-
// config/tailwind.config.js, its safelist and lib/tasks/tailwindcss_engine_motion.rake.
|
|
13
|
-
// This file is removed in the release after every consumer has adopted.
|
|
14
|
-
//
|
|
15
|
-
// Shared Tailwind config for all Studio apps
|
|
16
|
-
// Apps spread from this in their own tailwind.config.js
|
|
17
|
-
|
|
18
|
-
module.exports = {
|
|
19
|
-
darkMode: 'class',
|
|
20
|
-
theme: {
|
|
21
|
-
fontFamily: {
|
|
22
|
-
sans: ['Montserrat', 'system-ui', 'sans-serif'],
|
|
23
|
-
mono: ['ui-monospace', 'SFMono-Regular', 'monospace'],
|
|
24
|
-
},
|
|
25
|
-
extend: {
|
|
26
|
-
// Sub-xs type scale for dense UI (badges, meta rows, tick labels).
|
|
27
|
-
// Bare sizes (no line-height tuple) so text-2xs / text-3xs are drop-in
|
|
28
|
-
// replacements for the text-[11px] / text-[10px] arbitrary values that
|
|
29
|
-
// dominate the consumer apps.
|
|
30
|
-
fontSize: {
|
|
31
|
-
'2xs': '0.6875rem', // 11px
|
|
32
|
-
'3xs': '0.625rem', // 10px
|
|
33
|
-
},
|
|
34
|
-
colors: {
|
|
35
|
-
// Theme-aware semantic tokens (reference CSS variables)
|
|
36
|
-
page: 'var(--color-page)',
|
|
37
|
-
surface: 'var(--color-surface)',
|
|
38
|
-
'surface-alt': 'var(--color-surface-alt)',
|
|
39
|
-
inset: 'var(--color-inset)',
|
|
40
|
-
|
|
41
|
-
// Dynamic primary palette (from theme role colors)
|
|
42
|
-
primary: {
|
|
43
|
-
DEFAULT: 'rgb(var(--color-primary-rgb) / <alpha-value>)',
|
|
44
|
-
50: 'rgb(var(--color-primary-50-rgb) / <alpha-value>)',
|
|
45
|
-
100: 'rgb(var(--color-primary-100-rgb) / <alpha-value>)',
|
|
46
|
-
200: 'rgb(var(--color-primary-200-rgb) / <alpha-value>)',
|
|
47
|
-
300: 'rgb(var(--color-primary-300-rgb) / <alpha-value>)',
|
|
48
|
-
400: 'rgb(var(--color-primary-400-rgb) / <alpha-value>)',
|
|
49
|
-
500: 'rgb(var(--color-primary-500-rgb) / <alpha-value>)',
|
|
50
|
-
600: 'rgb(var(--color-primary-600-rgb) / <alpha-value>)',
|
|
51
|
-
700: 'rgb(var(--color-primary-700-rgb) / <alpha-value>)',
|
|
52
|
-
800: 'rgb(var(--color-primary-800-rgb) / <alpha-value>)',
|
|
53
|
-
900: 'rgb(var(--color-primary-900-rgb) / <alpha-value>)',
|
|
54
|
-
},
|
|
55
|
-
|
|
56
|
-
mint: {
|
|
57
|
-
DEFAULT: '#06D6A0',
|
|
58
|
-
50: '#e6faf4',
|
|
59
|
-
100: '#b3f0de',
|
|
60
|
-
200: '#80e6c8',
|
|
61
|
-
300: '#4ddcb2',
|
|
62
|
-
400: '#1ad29c',
|
|
63
|
-
500: '#06D6A0',
|
|
64
|
-
600: '#05b888',
|
|
65
|
-
700: '#049a70',
|
|
66
|
-
800: '#037c58',
|
|
67
|
-
900: '#025e40',
|
|
68
|
-
},
|
|
69
|
-
navy: {
|
|
70
|
-
DEFAULT: '#1A1535',
|
|
71
|
-
50: '#e8e7ed',
|
|
72
|
-
100: '#b8b5c8',
|
|
73
|
-
200: '#8883a3',
|
|
74
|
-
300: '#58517e',
|
|
75
|
-
400: '#3a3359',
|
|
76
|
-
500: '#1A1535',
|
|
77
|
-
600: '#16122e',
|
|
78
|
-
700: '#120f27',
|
|
79
|
-
800: '#0e0c20',
|
|
80
|
-
900: '#0a0919',
|
|
81
|
-
},
|
|
82
|
-
violet: {
|
|
83
|
-
DEFAULT: '#8E82FE',
|
|
84
|
-
50: '#f0eeff',
|
|
85
|
-
100: '#EAE8FF',
|
|
86
|
-
200: '#b2aafe',
|
|
87
|
-
300: '#C5C0FE',
|
|
88
|
-
400: '#8E82FE',
|
|
89
|
-
500: '#8E82FE',
|
|
90
|
-
600: '#6558e5',
|
|
91
|
-
700: '#6558E0',
|
|
92
|
-
800: '#3b2cb3',
|
|
93
|
-
900: '#3D2FB5',
|
|
94
|
-
},
|
|
95
|
-
mist: '#F7F6FF',
|
|
96
|
-
lavender: '#E8E6F0',
|
|
97
|
-
slate: '#6B6580',
|
|
98
|
-
charcoal: '#2D2648',
|
|
99
|
-
midnight: '#120F28',
|
|
100
|
-
ember: '#FF8C69',
|
|
101
|
-
gold: '#FFD166',
|
|
102
|
-
magenta: '#F72585',
|
|
103
|
-
},
|
|
104
|
-
textColor: {
|
|
105
|
-
heading: 'var(--color-text)',
|
|
106
|
-
body: 'var(--color-text-body)',
|
|
107
|
-
secondary: 'var(--color-text-secondary)',
|
|
108
|
-
muted: 'var(--color-text-muted)',
|
|
109
|
-
// The status roles as TEXT. Separate from the success / warning /
|
|
110
|
-
// danger FILLS below on purpose: a fill can be vivid, but text must
|
|
111
|
-
// clear WCAG AA 4.5:1 on every surface, and none of the default role
|
|
112
|
-
// colours does that on BOTH themes (#EF4444, #FF7C47 and #4BAF50 all
|
|
113
|
-
// fail on the light surfaces). Each ink is derived per theme by
|
|
114
|
-
// ThemeResolver#contrast_ink. There is deliberately NO text-danger,
|
|
115
|
-
// text-warning or text-success: a bare role colour as text is the
|
|
116
|
-
// defect, so it stays uncompilable.
|
|
117
|
-
'danger-ink': 'var(--color-danger-ink)',
|
|
118
|
-
'warning-ink': 'var(--color-warning-ink)',
|
|
119
|
-
'success-ink': 'var(--color-success-ink)',
|
|
120
|
-
// The primary role as chip text, derived the same way. text-primary
|
|
121
|
-
// stays the brand colour for links, icons and large text.
|
|
122
|
-
'primary-ink': 'var(--color-primary-ink)',
|
|
123
|
-
},
|
|
124
|
-
// The status-role FILLS: badge tints, flash panels, borders. Registered
|
|
125
|
-
// for backgrounds and borders ONLY (not `colors`), so that registering
|
|
126
|
-
// them cannot also mint the text utilities the comment above rules out.
|
|
127
|
-
backgroundColor: {
|
|
128
|
-
success: 'var(--color-success)',
|
|
129
|
-
warning: 'var(--color-warning)',
|
|
130
|
-
danger: 'var(--color-danger)',
|
|
131
|
-
},
|
|
132
|
-
borderColor: {
|
|
133
|
-
subtle: 'var(--color-border)',
|
|
134
|
-
strong: 'var(--color-border-strong)',
|
|
135
|
-
success: 'var(--color-success)',
|
|
136
|
-
warning: 'var(--color-warning)',
|
|
137
|
-
danger: 'var(--color-danger)',
|
|
138
|
-
},
|
|
139
|
-
},
|
|
140
|
-
},
|
|
141
|
-
}
|