@ape-egg/codie 0.1.6 → 0.1.7

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/README.md CHANGED
@@ -21,7 +21,7 @@ highlight + format +editable +live output, inspect,
21
21
  - **Syntax Highlighting**: HTML, CSS, and JavaScript with language-aware highlighting
22
22
  - **Editable Mode**: Transform static code into a live editor with textarea overlay
23
23
  - **Line Numbers**: Optional numbered rows for code reference
24
- - **Template Support**: Use `<template codie>` to preserve HTML without browser parsing
24
+ - **Its Own Element**: `<codie>` is the block; `<template codie>` holds HTML the browser must not parse
25
25
  - **Language Modes**: Granular control via attributes (`highlight-html`, `highlight-css`, `highlight-js`)
26
26
  - **Dark/Light Themes**: Toggle with `[dark]` attribute
27
27
  - **Runtime State Toggle**: Change features dynamically via `codieRef.editable`, `codieRef.numberedRows`
@@ -49,9 +49,21 @@ npm install @ape-egg/codie
49
49
  <script type="module">
50
50
  import codie from '@ape-egg/codie';
51
51
 
52
- codie('[codie]');
52
+ codie();
53
53
  </script>
54
54
 
55
+ <codie>
56
+ const greet = (name) => `Hello, ${name}!`;
57
+ </codie>
58
+ ```
59
+
60
+ `codie()` with no argument takes the first `<codie>` or `[codie]` element in the document.
61
+
62
+ ### HTML Inside the Block
63
+
64
+ The browser parses markup written inside `<codie>`. Put HTML in a `<template codie>` instead, so it reaches codie as text:
65
+
66
+ ```html
55
67
  <template codie>
56
68
  <div>
57
69
  <p>Hello, world!</p>
@@ -59,12 +71,14 @@ npm install @ape-egg/codie
59
71
  </template>
60
72
  ```
61
73
 
74
+ The `codie` attribute makes any element a codie instance; `<codie>` needs none.
75
+
62
76
  ### Editable Code with Line Numbers
63
77
 
64
78
  ```js
65
79
  import codie from '@ape-egg/codie';
66
80
 
67
- const editor = codie('[codie]');
81
+ const editor = codie('codie');
68
82
  editor.editable = true;
69
83
  editor.numberedRows = true;
70
84
  ```
@@ -74,7 +88,7 @@ editor.numberedRows = true;
74
88
  ```js
75
89
  const outputRef = document.querySelector('output');
76
90
 
77
- const editor = codie('[codie]');
91
+ const editor = codie('codie');
78
92
  editor.editable = true;
79
93
  editor.onEdit = ({ formatted, raw }) => {
80
94
  outputRef.innerHTML = formatted;
@@ -88,13 +102,13 @@ editor.onEdit = ({ formatted, raw }) => {
88
102
  <template codie highlight-html>...</template>
89
103
 
90
104
  <!-- Only highlight CSS -->
91
- <template codie highlight-css>...</template>
105
+ <codie highlight-css>...</codie>
92
106
 
93
107
  <!-- Only highlight JavaScript -->
94
- <template codie highlight-js>...</template>
108
+ <codie highlight-js>...</codie>
95
109
 
96
110
  <!-- Highlight all languages (default) -->
97
- <template codie>...</template>
111
+ <codie>...</codie>
98
112
  ```
99
113
 
100
114
  ## API
@@ -104,16 +118,16 @@ editor.onEdit = ({ formatted, raw }) => {
104
118
  Initialize a codie instance.
105
119
 
106
120
  **Parameters:**
107
- - `selector` (string): Query selector for codie element
121
+ - `selector` (string): Query selector for the codie element — `codie` for the element, `[codie]` for an attributed one
108
122
  - `element` (Element): DOM element reference
109
- - `config` (object): Configuration object with optional `editable`, `numberedRows`, `foldable` properties
123
+ - `config` (object): Configuration object with optional `editable`, `numberedRows`, `foldable` properties; the element is the first `codie, [codie]` in the document
110
124
 
111
125
  **Returns:** Codie instance proxy
112
126
 
113
127
  ### Instance Properties
114
128
 
115
129
  ```js
116
- const editor = codie('[codie]');
130
+ const editor = codie('codie');
117
131
 
118
132
  // Get/set code content
119
133
  editor.code; // Get current code
@@ -156,7 +170,9 @@ import {
156
170
 
157
171
  ### Container Attributes
158
172
 
159
- - `codie` - Marks element as codie instance
173
+ A `<codie>` element is an instance by its tag. The attributes below go on it, or on any other element carrying `codie`:
174
+
175
+ - `codie` - Marks an element that is not `<codie>` as an instance, `<template codie>` above all
160
176
  - `dehydrate` - Skip initialization (for documentation)
161
177
  - `highlight-html` - Enable HTML highlighting only
162
178
  - `highlight-css` - Enable CSS highlighting only
@@ -189,7 +205,7 @@ import codie from '@ape-egg/codie';
189
205
 
190
206
  init({ output: '' });
191
207
 
192
- const editor = codie('[codie]');
208
+ const editor = codie('template[codie]');
193
209
  editor.editable = true;
194
210
  editor.onEdit = ({ formatted }) => {
195
211
  $.output = formatted;
package/codie.js CHANGED
@@ -122,7 +122,7 @@ const codie = (elOrConfig = {}) => {
122
122
  config = {};
123
123
  } else {
124
124
  config = elOrConfig;
125
- el = document.querySelector(`[${ATTR.CODIE}]`);
125
+ el = document.querySelector(`${ATTR.CODIE}, [${ATTR.CODIE}]`);
126
126
  }
127
127
 
128
128
  if (!el) {
package/highlight-css.css CHANGED
@@ -1,14 +1,14 @@
1
1
  /* Codie CSS syntax highlighting */
2
2
 
3
- [codie] .codie-css-selector {
3
+ :where(codie, [codie]) .codie-css-selector {
4
4
  color: var(--codie-css-selector);
5
5
  font-weight: 600;
6
6
  }
7
7
 
8
- [codie] .codie-css-property {
8
+ :where(codie, [codie]) .codie-css-property {
9
9
  color: var(--codie-css-property);
10
10
  }
11
11
 
12
- [codie] .codie-css-value {
12
+ :where(codie, [codie]) .codie-css-value {
13
13
  color: var(--codie-css-value);
14
14
  }
@@ -1,41 +1,41 @@
1
1
  /* Codie HTML syntax highlighting */
2
2
 
3
- [codie] .codie-tag {
3
+ :where(codie, [codie]) .codie-tag {
4
4
  color: var(--codie-tag);
5
5
  font-weight: 600;
6
6
  }
7
7
 
8
- [codie] .codie-attr-name {
8
+ :where(codie, [codie]) .codie-attr-name {
9
9
  color: var(--codie-attr-name);
10
10
  }
11
11
 
12
- [codie] .codie-attr-value {
12
+ :where(codie, [codie]) .codie-attr-value {
13
13
  color: var(--codie-attr-value);
14
14
  }
15
15
 
16
- [codie] .codie-punct {
16
+ :where(codie, [codie]) .codie-punct {
17
17
  color: var(--codie-punct);
18
18
  }
19
19
 
20
- [codie] .codie-comment {
20
+ :where(codie, [codie]) .codie-comment {
21
21
  color: var(--codie-comment);
22
22
  }
23
23
 
24
- [codie] .codie-text {
24
+ :where(codie, [codie]) .codie-text {
25
25
  color: var(--codie-text);
26
26
  }
27
27
 
28
28
  /* Vibe-specific tokens */
29
- [codie] .codie-vibe {
29
+ :where(codie, [codie]) .codie-vibe {
30
30
  color: var(--codie-vibe);
31
31
  }
32
32
 
33
- [codie] .codie-vibe-var {
33
+ :where(codie, [codie]) .codie-vibe-var {
34
34
  color: var(--codie-vibe-var);
35
35
  transition: color 150ms ease-out;
36
36
  }
37
37
 
38
- [codie]:hover .codie-vibe-var,
39
- [codie].codie-has-selection .codie-vibe-var {
38
+ :where(codie, [codie]):hover .codie-vibe-var,
39
+ :where(codie, [codie]).codie-has-selection .codie-vibe-var {
40
40
  color: oklch(from currentColor calc(l + 0.25) c h);
41
41
  }
package/highlight-js.css CHANGED
@@ -1,29 +1,29 @@
1
1
  /* Codie JavaScript syntax highlighting */
2
2
 
3
- [codie] .codie-command {
3
+ :where(codie, [codie]) .codie-command {
4
4
  color: var(--codie-js-ident);
5
5
  }
6
6
 
7
- [codie] .codie-js-keyword {
7
+ :where(codie, [codie]) .codie-js-keyword {
8
8
  color: var(--codie-js-keyword);
9
9
  }
10
10
 
11
- [codie] .codie-js-import {
11
+ :where(codie, [codie]) .codie-js-import {
12
12
  color: var(--codie-js-import);
13
13
  }
14
14
 
15
- [codie] .codie-js-string {
15
+ :where(codie, [codie]) .codie-js-string {
16
16
  color: var(--codie-js-string);
17
17
  }
18
18
 
19
- [codie] .codie-js-function {
19
+ :where(codie, [codie]) .codie-js-function {
20
20
  color: var(--codie-js-function);
21
21
  }
22
22
 
23
- [codie] .codie-js-number {
23
+ :where(codie, [codie]) .codie-js-number {
24
24
  color: var(--codie-js-number);
25
25
  }
26
26
 
27
- [codie] .codie-js-ident {
27
+ :where(codie, [codie]) .codie-js-ident {
28
28
  color: var(--codie-js-ident);
29
29
  }
@@ -1,21 +1,21 @@
1
1
  /* Codie JSON syntax highlighting */
2
2
 
3
- [codie] .codie-json-key {
3
+ :where(codie, [codie]) .codie-json-key {
4
4
  color: var(--codie-json-key);
5
5
  }
6
6
 
7
- [codie] .codie-json-string {
7
+ :where(codie, [codie]) .codie-json-string {
8
8
  color: var(--codie-json-string);
9
9
  }
10
10
 
11
- [codie] .codie-json-number {
11
+ :where(codie, [codie]) .codie-json-number {
12
12
  color: var(--codie-json-number);
13
13
  }
14
14
 
15
- [codie] .codie-json-boolean {
15
+ :where(codie, [codie]) .codie-json-boolean {
16
16
  color: var(--codie-json-boolean);
17
17
  }
18
18
 
19
- [codie] .codie-json-null {
19
+ :where(codie, [codie]) .codie-json-null {
20
20
  color: var(--codie-json-null);
21
21
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ape-egg/codie",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "Modular code display and editing package",
5
5
  "type": "module",
6
6
  "main": "codie.js",
package/structure.css CHANGED
@@ -1,7 +1,7 @@
1
1
  /* Codie structure and layout */
2
2
 
3
3
  /* Container */
4
- [codie] {
4
+ :where(codie, [codie]) {
5
5
  display: grid;
6
6
  position: relative;
7
7
  width: 100%;
@@ -15,19 +15,19 @@
15
15
  border-radius: calc(var(--unit, 4px) * 1);
16
16
  scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
17
17
  }
18
- [codie]::-webkit-scrollbar-thumb {
18
+ :where(codie, [codie])::-webkit-scrollbar-thumb {
19
19
  background: var(--scrollbar-thumb);
20
20
  }
21
21
 
22
22
  /* Stack layers on same grid cell */
23
- [codie] > * {
23
+ :where(codie, [codie]) > * {
24
24
  grid-area: 1/1;
25
25
  min-width: max-content;
26
26
  align-self: start;
27
27
  }
28
28
 
29
29
  /* Code layer (shared between display and textarea) */
30
- [codie] .codie-layer {
30
+ :where(codie, [codie]) .codie-layer {
31
31
  margin: 0;
32
32
  padding: calc(var(--unit, 4px) * 4);
33
33
  font: inherit;
@@ -37,12 +37,12 @@
37
37
  }
38
38
 
39
39
  /* Display layer */
40
- [codie] .codie-display {
40
+ :where(codie, [codie]) .codie-display {
41
41
  pointer-events: none;
42
42
  }
43
43
 
44
44
  /* Textarea layer - hidden by default */
45
- [codie] .codie-textarea {
45
+ :where(codie, [codie]) .codie-textarea {
46
46
  display: none;
47
47
  width: 100%;
48
48
  field-sizing: content;
@@ -60,25 +60,25 @@
60
60
  }
61
61
 
62
62
  /* Editable mode - show textarea */
63
- [codie][editable] .codie-textarea {
63
+ :where(codie, [codie])[editable] .codie-textarea {
64
64
  display: block;
65
65
  }
66
66
 
67
- [codie][editable] .codie-display {
67
+ :where(codie, [codie])[editable] .codie-display {
68
68
  pointer-events: none;
69
69
  }
70
70
 
71
- [codie][editable] .codie-textarea::selection {
71
+ :where(codie, [codie])[editable] .codie-textarea::selection {
72
72
  background: var(--codie-selection);
73
73
  -webkit-text-fill-color: transparent;
74
74
  }
75
75
 
76
76
  /* Line numbers column */
77
- [codie][numbered] {
77
+ :where(codie, [codie])[numbered] {
78
78
  grid-template-columns: auto 1fr;
79
79
  }
80
80
 
81
- [codie] .codie-line-numbers {
81
+ :where(codie, [codie]) .codie-line-numbers {
82
82
  display: none;
83
83
  padding: calc(var(--unit, 4px) * 4);
84
84
  padding-right: calc(var(--unit, 4px) * 2);
@@ -88,46 +88,46 @@
88
88
  border-right: 1px solid oklch(from var(--codie-text) l c h / 0.1);
89
89
  }
90
90
 
91
- [codie][numbered] .codie-line-numbers {
91
+ :where(codie, [codie])[numbered] .codie-line-numbers {
92
92
  display: block;
93
93
  grid-area: 1/1;
94
94
  }
95
95
 
96
- [codie][numbered] .codie-layer {
96
+ :where(codie, [codie])[numbered] .codie-layer {
97
97
  grid-area: 1/2;
98
98
  }
99
99
 
100
100
  /* Line wrapping for highlighting */
101
- [codie] .codie-line {
101
+ :where(codie, [codie]) .codie-line {
102
102
  display: block;
103
103
  }
104
104
 
105
- [codie] .codie-line-highlight {
105
+ :where(codie, [codie]) .codie-line-highlight {
106
106
  background: var(--codie-highlight);
107
107
  }
108
108
 
109
109
  /* Focused state - dim non-highlighted lines */
110
- [codie].codie-focused .codie-line {
110
+ :where(codie, [codie]).codie-focused .codie-line {
111
111
  opacity: 0.4;
112
112
  transition: opacity 150ms ease-out;
113
113
  }
114
114
 
115
- [codie].codie-focused .codie-line.codie-line-highlight {
115
+ :where(codie, [codie]).codie-focused .codie-line.codie-line-highlight {
116
116
  opacity: 1;
117
117
  }
118
118
 
119
119
  /* Folding structure */
120
- [codie] .codie-fold-wrapper {
120
+ :where(codie, [codie]) .codie-fold-wrapper {
121
121
  display: grid;
122
122
  grid-template-rows: min-content 0fr;
123
123
  transition: grid-template-rows 200ms ease-out;
124
124
  }
125
125
 
126
- [codie] .codie-fold-wrapper.codie-fold-open {
126
+ :where(codie, [codie]) .codie-fold-wrapper.codie-fold-open {
127
127
  grid-template-rows: min-content 1fr;
128
128
  }
129
129
 
130
- [codie] .codie-fold-header {
130
+ :where(codie, [codie]) .codie-fold-header {
131
131
  display: flex;
132
132
  align-items: flex-start;
133
133
  gap: calc(var(--unit, 4px) * 1);
@@ -136,11 +136,11 @@
136
136
  transition: background-color 150ms ease-out;
137
137
  }
138
138
 
139
- [codie] .codie-fold-header:hover {
139
+ :where(codie, [codie]) .codie-fold-header:hover {
140
140
  background: var(--codie-fold-hover);
141
141
  }
142
142
 
143
- [codie] .codie-fold-toggle {
143
+ :where(codie, [codie]) .codie-fold-toggle {
144
144
  height: 18px;
145
145
  width: 18px;
146
146
  padding: 0;
@@ -160,37 +160,37 @@
160
160
  color: transparent;
161
161
  }
162
162
 
163
- [codie] .codie-fold-wrapper.codie-fold-open > .codie-fold-header > .codie-fold-toggle {
163
+ :where(codie, [codie]) .codie-fold-wrapper.codie-fold-open > .codie-fold-header > .codie-fold-toggle {
164
164
  color: oklch(from var(--codie-fold-icon) l c h / 0.1);
165
165
  transform: rotate(0deg);
166
166
  }
167
167
 
168
- [codie] .codie-fold-wrapper > .codie-fold-header:hover > .codie-fold-toggle {
168
+ :where(codie, [codie]) .codie-fold-wrapper > .codie-fold-header:hover > .codie-fold-toggle {
169
169
  color: var(--codie-fold-icon);
170
170
  }
171
171
 
172
- [codie] .codie-fold-content {
172
+ :where(codie, [codie]) .codie-fold-content {
173
173
  overflow: hidden;
174
174
  }
175
175
 
176
176
  /* Collapsed preview */
177
- [codie] .codie-fold-preview {
177
+ :where(codie, [codie]) .codie-fold-preview {
178
178
  display: none;
179
179
  color: var(--codie-text);
180
180
  opacity: 0.6;
181
181
  }
182
182
 
183
- [codie] .codie-fold-wrapper:not(.codie-fold-open) .codie-fold-preview {
183
+ :where(codie, [codie]) .codie-fold-wrapper:not(.codie-fold-open) .codie-fold-preview {
184
184
  display: inline;
185
185
  }
186
186
 
187
187
  /* Root fold has no toggle */
188
- [codie] .codie-fold-wrapper[data-root] > .codie-fold-header {
188
+ :where(codie, [codie]) .codie-fold-wrapper[data-root] > .codie-fold-header {
189
189
  cursor: default;
190
190
  pointer-events: none;
191
191
  }
192
192
 
193
- [codie] .codie-fold-wrapper[data-root] > .codie-fold-header > .codie-fold-toggle {
193
+ :where(codie, [codie]) .codie-fold-wrapper[data-root] > .codie-fold-header > .codie-fold-toggle {
194
194
  opacity: 0;
195
195
  pointer-events: none;
196
196
  }
package/theme.css CHANGED
@@ -51,9 +51,9 @@
51
51
  }
52
52
 
53
53
  /* Dark theme - VSCode Dark+ */
54
- .dark [codie],
55
- [dark] [codie],
56
- [codie][dark] {
54
+ .dark :where(codie, [codie]),
55
+ [dark] :where(codie, [codie]),
56
+ :where(codie, [codie])[dark] {
57
57
  --codie-bg: #1e1e1e;
58
58
  --codie-text: #d4d4d4;
59
59
  --codie-caret: #fff;