studio-engine 0.114.3 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a2bf6b51749b220d042ac4aaaf8fdb7550a70b67f9a0719a25ece9df48500c9
4
- data.tar.gz: 3599411182bf0ce8ffa7208a1e863ca4920ab81ec01e5a3fca43b86bb3394cbd
3
+ metadata.gz: '0899e08c1d3bce3e63d3f1c6cef0fa178c47d30a80ccb5246e7155d12f46eec9'
4
+ data.tar.gz: 933f3be8adef99b85196b1e873859b665d676fcc9c26af6cfb15ab4e32460293
5
5
  SHA512:
6
- metadata.gz: 15a9199ddeb33ee6ac21d89a269bb037579178ab7e15a84601810a9f200b88bcc5ec7a5b36756642df70bc6c7bb24ada365a4032fd26877c8071d4face0b95e8
7
- data.tar.gz: 3317d435449fc0156f6c93e5b40da19973c7fbefa6d125c3ec024c699c34076adc00e566b8d9dd9d3d5d7a9135dd4c81c73bcef802fd03d547246946a0cdda41
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) and [Turf Monster](https://app.turfmonster.media).
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 all three consumer Rails apps (`mcritchie-studio`,
28
- > `turf-monster`, `mcritchie-industries`) already use.
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
- Hosts adopt on their own cards (hub, Turf Monster, Rolio, chain-ops, Rantly,
85
- McRitchie Industries, Cyvasse, Moms App). Until each one does, it keeps
86
- building unchanged: `tailwind/studio.tailwind.config.js` stays one release as a
87
- deprecated shim, and `test/integration/tailwind_preset_parity_test.rb` holds it
88
- to the same utilities as `theme.css`. A host that has bumped the gem but not
89
- yet migrated gets the motion layer twice (once through `host.css`, once
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
- When every host has adopted, the shim and the parity test are deleted in one
128
- engine change. Before that, every reader of the preset has to move, not only
129
- the build: the hub's `app/services/client_apps/studio_kit/css.rb` reads it at
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 (a host still on `@config` lists only its `content:` globs). A utility
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
@@ -1,3 +1,3 @@
1
1
  module Studio
2
- VERSION = "0.114.3"
2
+ VERSION = "0.115.0.rc1"
3
3
  end
@@ -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/**/*", "tailwind/**/*", "Gemfile", "studio-engine.gemspec", "README.md", "CHANGELOG.md", "LICENSE",
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.114.3
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
- }